ObjectOutputStream && ObjectInputStream
ObjectOutputStream&&ObjectInputStream
处理流ObjectOutputStream&&ObjectInputStream
节点流&& 处理流
节点流:可以从一个特定的数据源(如:文件)读写数据,如:FileReader,FileWriter
处理流: (也叫包装流),是“连接”在已存在的流(节点流或处理流)之上

例如:BufferedReader类中有属性Reader,即可以封装一个节点流,该节点流可以是任意的,只要是Reader的子类就行(如上图:可以是文件,数组,管道,字符串…)
FileReader CharArrayReader PipedReader StringReader 都可以传进去 把它称为包装流
区别与联系
- 节点流是底层流/低级流,直接根数据源相接
- 处理流(包装流)包装节点流,使用了修饰器模式,不会直接与数据源项链
- 处理流对节点流进行包装,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出
处理流
拿BufferedReader来说,类里面有一个属性为Reader类的,构造器里传Reader类的 ,因此可以接受Reader子类的对象,就可以对它进行扩展(重写)
ObjectOutputStream
ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。 提供序列化功能
参数:OutputStream out:字节输出流。
构造方法:
ObjectOutputStream(OutputStream out) 因为它是一个处理流,所以需要一个节点流对象作为参数。
成员方法(无返回值):
void writeObject(Object obj) 将指定的对象写入 ObjectOutputStream (即ObjectOutputStream对象(把它叫做流对象吧)调用writeObject方法(流方法))
eg:
1
2ObjectOutputStream oos =new ObjectOutputStream(new FileOutputStream(filePath));
oos.writeObject(new Dog("旺财",10));void writeInt (int …) void writeChar(char …) void writeBoolean(boolean …) 同理
ObjectInputStream
(对象的反序列化流)的构造方法:
构造方法:
ObjectInputStream(InputStream in) 创建从指定 InputStream 读取的 ObjectInputStream。
参数:InputStream in:字节输入流成员方法:(读什么类型就返回什么类型的)
Object readObject() 从 ObjectInputStream 读取对象。 (这时就把对象看作一个大类)
即ObjectInputStream对象 使用readInt,readBoolean,readChar,reaIdObject方法读取,返回读取Object类
eg:
1
2
3ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));
Object dog = ois.readObject();int readInt() boolean readBoolean() char readChar () String readUTF() 同理
序列化
1 | |
Dog 类
1 | |
反序列化
1 | |
小总结:
- 创建ObjectInputStream (处理流)对象oos
- 处理流对象oos调用读取对象的方法readObject() 返回Object类型的对象dog
- 要调用序列化类的方法,需要向下强转为该类(Object—>Dog)再调用
- 读写顺序要一致
- 要求序列化或反序列化的对象,要实现Serializable
- 序列化的类中建议添加SerialVersionUID,为了提高版本的兼容性
- 序列化对象时,默认将里面的所有属性都进行序列化,但是除了static或transient(短暂的)修饰的成员它们不会被序列化
- 序列化对象时,要求里面的属性类型也需要实现序列化接口,像int 之类的也是间接实现序列化接口,自定义一种类的时候要注意实现序列化接口
- 序列化具备可继承性,如果某类已经实现了序列化,则它的所有子类也已经默认实现了序列化