14.保存对象

对象可以被序列化也可以被展开

对象序列化和文件的输入输出

将序列化对象写入文件

  1. 创建出FileOutputStream
  2. 创建ObjectOutputStream
  3. 写入对象
  4. 关闭ObjectOutputStream

数据在串流中移动

Object-写入> 对象碾平(ObjectOutputStream)-连接到>FileOutputStream->文件(目的地的)

对象呗序列化的时候发生了什么

如果要让类能够被序列化,就实现Serializable

序列化是全有或全无的

如果某实例变量不能被序列化,就把它标记为transient(瞬时)的

transient String CurrentID;

解序列化(Deserialization):还原对象

  1. 创建FileInputStream
  2. 创建ObjectInputStream
  3. 读取对象
  4. 转换对象类型
  5. 关闭ObjectInputStream

解序列化的时候发生了什么事

  1. 对象从stream中读出来
  2. Java虚拟机通过存储的信息判断出对象的class类型
  3. Java虚拟机尝试寻找和加载对象的类.如果找不到或无法加载该类,则Java虚拟机会抛出例外
  4. 新的对象会被配置在堆上,但构造函数不会执行.很明显的,这样会把对象的状态抹去有变成全新的,而这不是我们想要的结果.我们需要的是对象回到存储时的状态
  5. 如果对象在继承树上有个不可序列化的祖先类,则该不可序列化类以及在它智商的类构造器(就算是可序列化也一样)就会执行.一旦构造函数连锁启动之后将无法停止.也就是说,从第一个不可序列化的父类开始,全部都会重新初始化状态
  6. 对象的实例变量会被还原成序列化时点的状态值.transient变量会被赋值null的对象引用或primitive主数据类型的默认为0或false等.

要点

...

将字符串也如文本文件

缓冲区的奥妙之处

没有缓冲区,就好像逛超市没有推车一样.你只能一次拿一项东西结账

读取大文本