java 读写二进制数据与java序列化
2018-08-11 本文已影响0人
奔跑的蛙牛
DataOutput 接口定义如下几种方式已二进制格式读写数据
方法从文件中读取二进制数据
DataOutputSream out = new DataOutputStream(new FileInputSream("xx.dat"))
随机访问文件
RandomAccessFile类可以在文件中的任何位置查找或写入数据
zip文档
zip文档以压缩格式存储一个和多个文件,每个ZIP文件都有一个头,包含每个文件的名字和压缩方法等信息
对象流与序列化
需要存储相同类型的数据,使用固定长度存储是一个不错的选择
java 语言支持对象序列化的通用机制,可以将任何对象写入到流当中,并在之后将其读回
为了保存对象数据,首先需要打开一个ObjectOutputStrem对象
ObjectOutStream out = new ObjectOutputStream(new FileOutputStream("employee.dat"))
// 保存对象数据
Employee harry = new Employee("Harry Hacker",50000,1989,10,1);
Manager boss = new Manager("Carl Cracker",80000,1987,12,15);
out.writeObject(harry);
out.writeObject(boss);
// 读回对象数据
ObjectInputStream in = new ObjectInputStream(new FileInputStream("employee.dat"));
// 然后用 readObject方法以这些对象写入的顺序获得他们
Employee e1 = (Emloyee) in.readObject();
Employee e2 = (Employee) in.readObject();
// 如果希望在对象流中存储或者恢复所有的类都应进行一下修改,这些类必须实现Serializable接口
class Employee implements Serializable { ... }
这里再讲解一下序列化
一个类只有实现Serializable接口才能被序列化
什么是序列化:将对象的状态信息转换为可以传输和存储的过程,想对象此时的状态信息写出临时缓冲区或者永久缓冲区,日后需要的时候再转化为对象,重新使用
Serializable主要用来支持两种主要的特性:
-
Java的RMI(remote method invocation),RMI允许像在本机上一样操作远程机器上的对象,当发送消息给远程对象时,就需要用到序列化机制来发送参数和接受返回值
-
Java的JavaBean,Bean的状态信息通常是在设计时配置的,Bean的状态信息必须被保存下来,以便当程序运行时能恢复这些状态信息,这也需要序Serializable机制
这个图片serializable的相关知识点和用途
重点不了解的话请查阅或者@我
如果一个普通员工是两个经理的秘书,这种共享对象该如何存储
共享秘书
下面是相关算法
- 对遇到的每一个对象都关联一个序列号
- 对于每个对象,第一次遇到时都把它保存到对象数据流中
- 如果对象之前被保存过,那么只写出“与之前保存过的序列号为x的对象相同”
- 对于流中的对象,在第一次遇到其序列号时,构建它,并使用流中的数据初始化它,然后记录这个新序号和对象之间的关联
- 当遇到 “保存过的序列号为x的对象相同”,获取这个顺序号相关联的对象引用
具体实现结果 查看代码