对象流:

ObjectInputStream/ObjectOutputStream:对象流,用于将对象的属性信息保存到磁盘上,和将磁盘里保存的对象读取到程序上。

示意图:

对象流,加解密流,与基本数据类型流_基本数据



对象也不是能直接通过对象流保存到磁盘上的,如果要保存的那个对象没有实现Serializable接口是保存不了的,会抛出异常。

  代码示例:

对象流,加解密流,与基本数据类型流_类型流_02

对象流,加解密流,与基本数据类型流_基本数据_03


运行结果:

对象流,加解密流,与基本数据类型流_对象流_04

 没有实现Serializable接口是会抛NotSerializableException异常的。




实现接口后:

对象流,加解密流,与基本数据类型流_类型流_05

对象流,加解密流,与基本数据类型流_类型流_06



运行结果:

对象流,加解密流,与基本数据类型流_基本数据_07




这个接口的内部什么都没有的,就是一个空接口,但是为什么要实现这么一个接口呢,是因为这相当于一个身份的象征,只有实现了这个接口,java虚拟机看到这个对象有这个“身份标记”才能将它的属性保存到磁盘上去。为什么不实现这个接口就不能保存呢?这是因为有些对象属性信息保存着一些比较重要的数据,如果轻易保存到磁盘上就会有一定的风险,所以没有实现这个接口的所有对象是无法被保存的。

 

除了这个需要实现这个接口外还有一个问题,如果我把对象的某个属性删除了或增加某个属性,那么将这个对象读取出来就会发生异常。

  代码示例:

对象流,加解密流,与基本数据类型流_对象流_08

对象流,加解密流,与基本数据类型流_类型流_09


运行结果:

对象流,加解密流,与基本数据类型流_基本数据_10


会发生这个异常的原因是类的版本号不同,每个类编译时都有自己的版本号,对这个类进行更改了,这个类的版本号就会改变。

 

那么解决这个问题的方法就是:自行设置一个唯一的版本号,这玩意就像构造器一样,你写了虚拟机就不会给你自动加了,所以需要自行设置一个唯一的版本号。

  代码示例:

对象流,加解密流,与基本数据类型流_类型流_11


版本号的数字可以自己任意设置。只要不超出long类型的容量即可。

设置完版本号后,我们再进行实验一下,把对象的某个属性删除了或增加某个属性,看看是否还会抛出异常。

  代码示例:

对象流,加解密流,与基本数据类型流_类型流_12

对象流,加解密流,与基本数据类型流_类型流_13


运行结果:

对象流,加解密流,与基本数据类型流_对象流_14

能够正常运行,不会报错。



如果想要对象的某个属性不被存储到硬盘上的时候,就需要用到transient无需序列化关键字。在保存对象的时候加上这个关键字的属性就不会被保存。

  代码示例:

对象流,加解密流,与基本数据类型流_基本数据_15

对象流,加解密流,与基本数据类型流_类型流_16


运行结果:

对象流,加解密流,与基本数据类型流_对象流_17


从运行结果可以看出,加上这个关键字的属性值就会为null(基本类型值则会为0),表示没有保存。

 

利用对象流可以一个记忆窗口坐标位置的功能,能让窗口程序每次打开都在上一次关闭的位置。

代码示例:

先写好一个具有四个属性分别用于记录窗口的XYWidthHeight坐标的值。并且在构造器声明四个参数,用于传递窗口的XYWidthHeight坐标值:

对象流,加解密流,与基本数据类型流_类型流_18

对象流,加解密流,与基本数据类型流_对象流_19

对象流,加解密流,与基本数据类型流_对象流_20


  在对象流中要注意的是对象是无法追加输出的,所以不要追加输出。多个对象则可以一起一次性输出,但是同一个对象则无法输出两次。



基本数据类型流:

 DataInputStream/DataOutputStream:基本数据类型流,用于将基本数据类型的值存储到磁盘中,选择输出的数据类型是多少个字节的,那么输出最少就会占用多少个字节。例如int是占用四个字节,那么在输出的时候占用的也是四个字节,其他类型则以此类推。这个流平时并不常用,一般都是专门处理数据方面的人员才会用得上。

 

代码示例:

对象流,加解密流,与基本数据类型流_基本数据_21


运行结果:

对象流,加解密流,与基本数据类型流_对象流_22





加密解密流:

下面介绍最简单的加密方式,如果想要做复杂的加密方式可以自己编写一个加解密算法,但是在公司开发中除非你是专业人员,不然是不需要自行对程序去做加解密的,这些都是由专业的加解密人员去完成,所以对这方面知道个简单原理就可以了。

先编写两个流,一个加密流,和一个解密流。利用装饰设计模式去编写:

加密流:

  代码示例:

对象流,加解密流,与基本数据类型流_对象流_23


解密流:

代码示例:

对象流,加解密流,与基本数据类型流_基本数据_24



测试类:

代码示例:

对象流,加解密流,与基本数据类型流_类型流_25


加密后的文件内容:

对象流,加解密流,与基本数据类型流_类型流_26


解密后读取打印出来的内容:

对象流,加解密流,与基本数据类型流_对象流_27