08_1_IO
1. 输入/输出流的分类
java.io包中定义了多个流类型(类或抽象类)来实现输入/输出功能;可以从不同的角度对其进行分类:
按数据流的方向不同可以分给输入流和输出流。
按处理数据单位不同可以分为字节流和字符流。
按照功能不同可以分为节点流和处理流。
字节流 |
字符流 |
|
输入流 |
InputStream |
Reader |
输出流 |
OutputStream |
Write |
2. 节点流和处理流
节点流为可以从一个特定的数据源(节点)读写数据(如:文件,内存)
处理流是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。
3. 节点流类型
类型 |
字符流 |
字节流 |
File(文件) |
FileReader FileWriter |
FileInputStream FileOutputStream |
Memory Array |
CharArrayReader CharArrayWriter |
ByteArrayInputStream ByteArrayOutputStream |
Memory String |
StringReader StringWriter |
|
Pipe(管道) |
PipedReader PipedWriter |
PipedInputStream PipedOutputStream |
4. 处理流类型
处理类型 |
字符流 |
字节流 |
Buffering |
BufferedReader BufferedWriter |
BufferedInputStream BufferedOutputStream |
Filtering |
FilterReader FilterWriter |
FilterInputStream FilterOutputStream |
Converting between bytes and character |
InputStreamReader OutputStreamWriter |
|
Object Serialization |
ObjectInputStream ObjectOutputStream |
|
Data coversion |
DataInputStream DataOutputStrearm |
|
Counting |
LineNumberReadeer |
LineNumberInputStream |
Peeking ahead |
PushbackReader |
PushbackInputStream |
Printing |
PrintWriter |
PrintStream |
5. Object流
serializable 序列化,将一个对象,转换为字节流保存到硬盘。
package Test; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutput; import java.io.ObjectOutputStream; import java.io.Serializable; public class TestObjectIO { public static void main(String[] args) throws Exception { T t = new T(); t.k = 30; FileOutputStream fos = new FileOutputStream("F:/TestObjectIO.txt"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(t); oos.flush(); oos.close(); FileInputStream fis = new FileInputStream("F:/TestObjectIO.txt"); ObjectInputStream ois = new ObjectInputStream(fis); T a = (T)ois.readObject(); System.out.println(a.i +" " + a.j + " " + a.d + " " + a.k); fos.close(); fis.close(); ois.close(); } } class T implements Serializable { int i = 10; int j = 20; double d = 3.2; //transient 在序列化的时候,不予考虑,也及读出来之后为0 transient int k = 15; }