一、简介
1.概述
该流可以将一个对象写出, 或者读取一个对象到程序中. 也就是执行了序列化和反序列化的操作
①ObjectOutputStream(对象写出,序列化)
ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。
只能将支持 java.io.Serializable 接口的对象写入流中。每个 serializable 对象的类都被编码。
writeObject 方法用于将对象写入流中。
②ObjectInputStream(读取对象,反序列化)
ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。
只有支持 java.io.Serializable 或 java.io.Externalizable 接口的对象才能从流读取。
readObject
方法用于从流读取对象。
2.方法
①ObjectOutputStream
ObjectOutputStream(OutputStream out)
创建写入指定 OutputStream 的 ObjectOutputStream。
void
writeObject(Object obj)
将指定的对象写入 ObjectOutputStream。
②ObjectInputStream
ObjectInputStream(InputStream in)
创建从指定 InputStream 读取的 ObjectInputStream。
Object
readObject()
从 ObjectInputStream 读取对象。
二、使用
1.代码
①ObjectOutputStream
public static void demo1() throws IOException, FileNotFoundException {
Person p1 = new Person("张三", 23);
Person p2 = new Person("李四", 24);
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("e.txt"));
oos.writeObject(p1);
oos.writeObject(p2);
oos.close();
}
public static void main(String[] args) throws IOException {
Person p1 = new Person("张三", 23);
Person p2 = new Person("李四", 24);
Person p3 = new Person("王五", 25);
Person p4 = new Person("赵六", 26);
ArrayList<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("e.txt"));
oos.writeObject(list); //把整个集合对象一次写出
oos.close();
}
②ObjectInputStream
public static void demo1() throws IOException, FileNotFoundException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("e.txt"));
Person p1 = (Person) ois.readObject();
Person p2 = (Person) ois.readObject();
//Person p3 = (Person) ois.readObject(); //当文件读取到了末尾时出现EOFException
System.out.println(p1);
System.out.println(p2);
ois.close();
}
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("e.txt"));
ArrayList<Person> list = (ArrayList<Person>) ois.readObject(); //将集合对象一次读取
for (Person person : list) {
System.out.println(person);
}
ois.close();
}
2.ID号
Person实体类中加ID号
private static final long serialVersionUID = 1L;
注明这是哪一个版本的Person类,每次修改Person类中成员时,需要修改ID号以注明,防止写出对象和读入对象不匹配的情况出现
注:
- 要写出的对象必须实现Serializable接口才能被序列化
- 不用必须加id号