IO流-对象流
这个流的作用是,把程序中的对象存到磁盘中 (文本文档) ,然后还能读取回来继续用
注意:
对象流传输的是对象
对象流传输的是对象
对象流传输的是对象
对象流在写出对象(存储到本地)时,会自动序列化对象, 对象和对象的类都有一条相同的序列号,在读取对象回到
程序时,程序会比对对象和对象类的序列号,序列号一样,将对象按照对象类的格式反序列化转换成对象原本的样
子.
对象-->序列化(加密)-->存到本地文件
本地文件-->反序列化(解密)-->重新读取回到程序
对象和对象的类的序列号是一样的
序列号就相当于<对象> 匹配 <对象类> 的标识
如果对象被储存到本地文件后,对象的类的内容发生改变,那么对象类的序列号也会改变
这时将本地文件中的对象读取回程序时, <对象>序列号 无法匹配 <对象类>序列号,那么无法读取,程序报错
通俗讲, 程序是看 <序列号> 来分辨 <对象> 是哪个 <类> ,<类>的内容改变,<类> 的 <序列号> 改变
<对象> 和 <类> 的序列号不一样, 程序分辨不出来 <对象> 是哪个类 ,程序报错
程序直接傻了,这个<对象>是谁啊? 怎么跟我这里的 <类> 都匹配不上,我淦
注意 !!! : 自定义类需要实现Serializable接口
最后补充一点.私有化的静态属性不会被序列化
private static
为了代码可读性,下面代码全部抛出错误,实际使用中要用try/catch捕获
1.<ObjectOutputStream>输出流
下面,我来存一个集合
存数组的好处就是,可以把 <自定义类对象> 放进 集合,存到本地,然后读取集合,通过集合使用<自定义类对象>
这就很方便啊
public class demo {
public static void main(String[] args) throws Exception {
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("a.txt"));
List<Integer> integers = new ArrayList<>();
integers.add(1);
integers.add(2);
integers.add(3);
integers.add(4);
integers.add(5);
//写到目标地址文件中
objectOutputStream.writeObject(integers);
//关流
objectOutputStream.close();
}
}
a.txt 内容
�� sr java.util.ArrayListx����a� I sizexp w sr java.lang.Integer⠤���8 I valuexr java.lang.Number������ xp sq ~ sq ~ sq ~ sq ~ x
内容是乱码的,人看不懂, 但是电脑看得懂
2.<ObjectInputStream>输入流
读取刚刚存的数据
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("a.txt"));
//读取 读取到的是Object类
Object o = objectInputStream.readObject();
//关流
objectInputStream.close();
//将读取到的Object类对象强转回原来的对象
List<Integer> list = (List)o;
//输出看看
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
输出结果
1
2
3
4
5