序列化流
编辑
▶ ObjectOutputStream --- 对象的序列化流
java.io.ObjectOutputStream extends OutputStream
作用 :把对象以流的方式写入到文件中保存
✔ 构造方法 :
ObjectOutputStream( OutputStream out ) 创建写入指定 OutputStream 的 ObjectOutputStream
参数 :
OutputStream out --- 字节输出流
✔ 特有的成员方法 :
--- void writeObject( Object obj ) 将指定的对象写入 ObjectOutputStream
✔ 使用步骤 :
(1)创建ObjectOutputStream对象,构造方法中传递字节输出流
(2)使用ObjectOutputStream对象中的方法 writeObject,把对象写入到文件中
(3)释放资源
✔ 序列化和反序列化的时候会抛出NotSerializableException异常,即没有序列化异常
类通过实现 java.io.Serializable 接口以启用其序列化功能,未实现此接口的类将无法使其任何状态序列化或反序列化
Serializable接口也叫标记型接口,要进行序列化和反序列化的类必须实现Serializable接口,就会给类添加一个标记
当我们进行序列化和反序列化的时候,就会检测类上是否有这个标记
--- 有:就可以序列化和反序列化
--- 没有:就会抛出 NotSerializableException异常
就像去市场买肉-->肉上有一个蓝色章(检测合格)-->放心购买-->买回来怎么吃随意
编辑
▶ ObjectInputStream --- 对象的反序列化流
java.io.ObjectInputStream extends InputStream
作用 :把文件中保存的对象,以流的方式读取出来使用
✔ 构造方法:
--- ObjectInputStream( InputStream in ) 创建从指定 InputStream 读取的 ObjectInputStream
参数:
InputStream in -- 字节输入流
✔ 特有的成员方法:
--- Object readObject() 从 ObjectInputStream 读取对象
✔ 使用步骤:
(1)创建ObjectInputStream对象,构造方法中传递字节输入流
(2)使用ObjectInputStream对象中的方法readObject读取保存对象的文件
(3)释放资源
(4)使用读取出来的对象(打印)
✔ readObject方法声明抛出了ClassNotFoundException(class文件找不到异常)
当不存在对象的class文件时抛出此异常
✔ 反序列化的前提:
(1)类必须实现Serializable
(2)必须存在类对应的class文件
编辑
▶ transient --- 瞬态关键字
✔ static关键字 :静态关键字
静态优先于非静态加载到内存中(静态优先于对象进入到内存中)
被static修饰的成员变量不能被序列化的,序列化的都是对象
private static int age; oos.writeObject(new Person("小美女",18)); Object o = ois.readObject(); Person{name='小美女', age=0}
✔ transient关键字 :瞬态关键字
被transient修饰成员变量,不能被序列化
private transient int age; oos.writeObject(new Person("小美女",18)); Object o = ois.readObject(); Person{name='小美女', age=0}
▶ InvalidClassException 异常
编辑
▶ 练习 :序列化集合
当我们想在文件中保存多个对象的时候,可以把多个对象存储到一个集合中,对集合进序列化和反序列化
分析:
(1)定义一个存储Person对象的ArrayList集合
(2)往ArrayList集合中存储Person对象
(3)创建一个序列化流ObjectOutputStream对象
(4)使用ObjectOutputStream对象中的方法writeObject,对集合进行序列化
(5)创建一个反序列化ObjectInputStream对象
(6)使用ObjectInputStream对象中的方法readObject读取文件中保存的集合
(7)把Object类型的集合转换为ArrayList类型
(8)遍历ArrayList集合
(9)释放资源
编辑
打印流
java.io.PrintStream
功能:为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。
✔ PrintStream特点:
(1)只负责数据的输出,不负责数据的读取
(2)与其他输出流不同,PrintStream 永远不会抛出 IOException
(3)有特有的方法,print,println
--- void print(任意类型的值)
--- void println(任意类型的值并换行)
✔ 构造方法:
--- PrintStream(File file):输出的目的地是一个文件
--- PrintStream(OutputStream out):输出的目的地是一个字节输出流
--- PrintStream(String fileName) :输出的目的地是一个文件路径
✔ PrintStream extends OutputStream 继承自父类的成员方法:
--- public void close() :关闭此输出流并释放与此流相关联的任何系统资源
--- public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出
--- public void write(byte[] b):将 b.length字节从指定的字节数组写入此输出流
--- public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流
--- public abstract void write(int b) :将指定的字节输出流
✔ 注意:
如果使用继承自父类的write方法写数据,那么查看数据的时候会查询编码表 97->a
如果使用自己特有的方法print/println方法写数据,写的数据原样输出 97->97
编辑
输出:
编辑
✔ 改变输出语句的目的地(打印流的流向)
输出语句默认在控制台输出
使用System.setOut方法改变输出语句的目的地改为参数中传递的打印流的目的地
--- static void setOut(PrintStream out) 重新分配“标准”输出流。
编辑
编辑