对象操作流
核心代码无变化,所以不做多余记录
什么是对象操作流
将对象进行序列化操作和反序列化操作的流,读出就是序列化,写入就是反序列化。
写出的用法:
(1)先要有个实体类并实现 Serializable 接口
(2)在测试类里:
//创建写出对象操作流对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt"));
//创建实体对象
Person p1 = new Person("yuan","18岁");
//将对象添加到目的地
oos.writeObject(p1);
//关闭流
oos.colse()
读入的用法:
(1)直接在测试类里:
//创建对象操作流对象
ObjectInputStream ois =new ObjectInputStream(new FileInputStream("a.txt"));
//打印读到的内容
System.out.println(ois.readObject());//该方法,读一条定将指针下移
灵魂3问:
1.修改序列化对象文件会出问题吗
类的串行版本与从流中读取的类描述符的类型不匹配
该类包含未知的数据类型
该类没有可访问的无参数构造函数
这三种情况会抛出InvalidClassException
2.如何解决
添加 private static final long serialVersionUID = 31234L;
3.有不想被序列化的成员变量怎么处理
给该成员变量添加 transient 关键字修饰
优化的思路:
(1)写入的时候:
1)把要写入的实体对象创建好。
2)把创建好的实体对象放到一个集合里。
2)把这个集合写出到文件。
(2)读出的时候:
1)读取集合。
用增强for遍历,并读出。
例子
package com.yuan.io.learn;
import java.io.*;
public class 对象操作流 {
public static void main(String[] args) {
try (
//对象反序列化流
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("Object.txt"));
//对象序列化流
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("Object.txt"))
) {
Person people_1 = new Person("图图", 23);
Person people_2 = new Person("兮兮", 23);
//这样就将数据写到了文件中,注意!虽然看不懂文件内容但没关系。用反序列化写出来就OK!
oos.writeObject(people_1);
oos.writeObject(people_2);
//用反序列化写出来[这里如果要用循环 只能添加到集合里]
final Object peop1 = ois.readObject();
System.out.println("peop1 = " + peop1);
final Object peop2 = ois.readObject();
System.out.println("peop2 = " + peop2);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
网友评论