序列化
对象的序列化流_ObjectOutputStream
java.io.ObjectOutputStream extends OutputStream
作用:把对象以流的方式写入到文件中保存
构造方法:
ObjectOutputStream(OutputStream out) 创建写入指定 OutputStream 的 ObjectOutputStream。
参数:
OutputStream out:字节输出流
特有的成员方法:
void writeObject(Object obj) 将指定的对象写入 ObjectOutputStream。
使用步骤:
-
创建一个ObjectOutputStream对象,构造方法中传递字节输出流
-
使用ObjectOutputStream对象中的方法writeObject,把对象写入到文件中
-
释放资源
序列化和反序列化的时候,会抛出NotSerializableException没有序列化异常
类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。
Serializable 接口也叫标记型接口
要进行序列化和反序列化的类必须实现Serializable 接口,就会给类添加一个标记
当我们进行序列化和反序列化的时候,就会检测类上是否有这个标记
有:就可以序列化和反序列化
没有:就会抛出NotSerializableException异常
对象的反序列化流_ObjectInputStream
java.io.ObjectInputStream extends InputStream
作用:把文件中保存的对象以流的方式读取出来使用
构造方法:
ObjectInputStream(InputStream in) 创建从指定 InputStream 读取的 ObjectInputStream。
参数:
InputStream in:字节输入流
特有的成员方法:
Object readObject() 从 ObjectInputStream 读取对象。
声明抛出了ClassNotFoundException(class文件找不到异常)
当不存在对象的class文件时抛出异常
反序列化的前提:
1.类必须实现 Serializable
2.必须存在类对应的class文件
使用步骤:
-
创建ObjectInputStream对象,构造方法中传递字节输入流
-
使用ObjectInputStream对象中的方法readObject读取保存对象的文件
-
释放资源
-
使用读取出来的对象
transient关键字_瞬态关键字
static:静态关键字
静态优先于非静态加载到内存中(静态优先于对象进入到内存中)
被static修饰的成员变量不能被序列化的,序列化的都是对象
transient:瞬态关键字
被transient修饰的成员变量,不能被序列化
InvalidClassException异常_原理和解决方案
打印流
java.io.PrintStream extends OutputStream
PrintStream
为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。
特点:
-
只负责数据的输出,不负责数据的读取
-
与其他输出流不同,
PrintStream
永远不会抛出IOException
-
有特有的方法,print,println
构造方法:
PrintStream(File file):输出的目的地是一个文件
PrintStream(OutputStream out):输出的目的地是一个字节输出流
PrintStream(String fileName):输出的目的地是一个文件路径
继承自父类的成员方法:
-
public void close() 关闭此输出流并释放与此流有关的所有系统资源。
-
public void flush() 刷新此输出流并强制写出所有缓冲的输出字节。
-
public void write(byte[] b) 将 b.length 个字节从指定的 byte 数组写入此输出流。
-
public void write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
-
public abstract void write(int b) 将指定的字节写入此输出流。
注意:
如果使用继承自父类的write方法写数据,那么查看数据的时候会查询编码表 97—>a
如果使用自己特有的方法print/println方法写数据,写的数据原样输出 97—>97
可以改变输出语句的目的地(打印流的流向)
输出语句,默认在控制台输出
使用System.setOut方法改变输出语句的目的地改为参数传递的打印流的目的地
static void setOut(PrintStream out) 重新分配“标准”输出流。