Java——IO系统概览 (9)

当我们进行对序列化进行控制时,可能某个特定的子对象不想让Java的序列化机制自动保存与恢复。比如子对象保存的是密码等敏感信息。那么我们就可以使用transient(瞬时)关键字逐个字段地关闭序列化。

比如在上例中不想保留age域:

private transient Integer age;

将对象序列化然后反序列化后的结果为:

Student info [name=sakura , age=null]

没有被序列化的属性的值将为null

序列化的算法

每个对象都是用序列号(serila number)(序列号代替了对象的内存地址)保存的,这也是这种机制称为序列化的原因。序列化的算法大致如下:

对你遇到的每一个对象引用都关联一个序列号

对于每个对象,当第一次遇到时,保存其对象数据到输出流中

如果某个对象之前已经被保存过了,那么只写出“与之前保存过的序列号为x的对象相同”

在读回对象时,整个过程是反过来的

对于对象输入流中的对象,在第一次遇到其序列号时,构建它,并使用流中数据来初始化它,然后记录这个序列号和新对象之前的关联

当遇见“与之前保存过的序列号为x的对象相同”标记时,获取与这个顺序号相关联的对象的引用

File类

最后,我们简单介绍下File类。这个名字具有一定的误导性,我们可能会认为它指代的是一个文件,但是事实却并非如此。它既可以代表一个特定的文件的名称,又能代表目录下的一组文件的名称。使用FilePath可能更准确来命名这个类。这个类表示的是文件和目录名的抽象表示。具体的使用不再过多介绍,查看JDK文档便可以了解。

小结

本篇博客大体介绍了Java I/O流的一个发展(字符流到字节流的),使用装饰器类让流对象具有更多的功能,I/O流的典型使用方式,Java中的标准I/O,NIO中的速度的提升靠的是通道和缓冲区(缓冲区内数据变化时缓冲区的状态变化)和对象序列化。总结一下,Java来创建一个合适的流对象要先创建很多的类确实是有点麻烦的,但是理解每个类对象实现的功能是什么以及组装好一个新对象可以拥有什么功能的话,这样的组装也就显得不是那么的麻烦。

Java语言很多时候都是使用基本的类、属性和方法来对操作系统层面的操作进行描述。它只有描述能力,并没有直接操作能力。博客一开始就介绍了什么是流,流也还可以这样理解:对操作系统层面操作的一个抽象描述以及封装。

对Java中I/O类库的介绍暂记以上。

参考:

《Java编程思想》第4版

《Java核心技术2》第10版

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgdyfw.html