java编程思想读书笔记 第十八章 java I/O系统(第五篇)

1. 压缩
压缩要注意的:
1)压缩类库是按字节方式而不是字符方式处理的;
2)尽管存在许多种压缩算法,但是Zip和GZIP是最常用;
3)Zip压缩和GZIP的区别:GZIP接口非常简单,适合对单个数据了进行压缩;Zip是适用于压缩多个文件的格式以及jar文件格式中。
4)Zip压缩和GZIP的共同点:Zip或GZIP库的使用并不仅仅局限于文件—它可以压缩任何东西,包括需要通过网络发送数据。

2. 对象序列化
java的对象序列化将那些实现了Serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列完全恢复为原来的对象。

1)利用序列化可以实现轻量级持久性,持久性意味着一个对象的生存周期并不取决于程序是否正在执行,它可以生存于程序的调用之间。

2)序列化一个对象的步骤:
 首先要创建某些OutputStream对象
 将其封装在一个ObjectOutputStream对象内
 调用writeObject()即可将对象序列化
 并将其发送给OutputStream

3)反序列化(将一个序列还原为一个对象)的步骤:
 将InputStream封装在ObjectInputStream内
 调用readObject()

4)如果不希望对象的某一部分被序列化;或者一个对象被还原以后,某自对象需要重新创建,从而不必将该自对象序列化,那这时就需要实现Externalizable接口代替实现Serializable接口来对序列化过程进行控制。同时还增添了两个方法writeExternal()和readExternal()。这两个方法会在序列化和反序列化还原的过程中被自动调用。还有一种方法就是实现erializable接口,并添加名为writeObject()和readObject()的方法,这样一旦对象被序列化或者反序列化还原,就会自动地分别调用这两个方法。这两个方法必须具有准确的方法特征签名,如下:

private void writeObject(ObjectOutputStream stream) throws IOException;
private void readObject(ObjectInputStream stream) throws IOException,ClassNotFoundException;

5)对于Serializable对象,对象完全以它存储的二进制位基础来构造,而不用调用构造器,而对于Externalizable对象,所有普通的默认构造器都会被调用,才能使Externalizable对象产生正确的行为。

6)如果正在操作一个erializable对象,那么所有的序列化操作都会自动进行。然而对于逐个字段地关闭序列化,那就需要使用到transient关键字(意思是不用麻烦你保存或修复数据—我自己会处理的)

7)使用“持久性”
只要将任何对象序列化到单一流中,就可以恢复出与我们写出时一样的对象网,并且没有任何意外重复复制出的对象。当然,我们可以在写出第一个对象和写出最后一个对象期间改变这些对象的状态,但是这是我们自己的事;无论对象在被序列化时处于什么状态(无论它们和其他对象有什么样的连接关系),我们都可以被写出。
Class是Serializable的,因此只需要直接对Class对象序列化,就可以很容易的保存static字段,任何情况下,这都是一种明智的做法。但是必须自己动手去实现序列化static的值。使用serializeStaticState()和deserializeStaticState()两个static方法,它们是作为存储和读取过程的一部分被显示的调用的。
安全问题:序列化会将private数据保存下来,对于你关心的安全问题,应将其标记为transient。但是这之后,你还必须设计一种安全的保存信息的方法,以便在执行恢复时可以复位那些private变量。

3. XML
对象序列化的一个重要限制是它只是java的解决方案:只有java程序才能反序列化这种对象。一种更具互操作性的解决方案是将数据转换为XML格式,这可以使其被各种各样的平台和语言使用。

4. Preferences
Preferences API与对象序列化相比,前者与对象持久性更密切,因为它可以自动存储和读取信息。不过,它只能用于小的、受限的数据集合–只能存储基本类型和字符串,并且每个字符串的存储长度不能超过8K。Preferences API用于存储和读取用户的偏好以及程序配置项的设置。
Preferences 是一个键-值集合,存储在一个节点层次结构中。尽管节点层次结构可用来创建更为复杂的结构,但通常是创建以你的类名命名的单一节点,然后将信息存储于其中。
Preferences的两种创建方式:

Preferences.userNodeForPackage()
Preferences.systemNodeForPackage()

两者都可以选择,但是通常最好将“user”用于用户的偏好,“system”用于通常的安装配置。
注意get()的第二个参数:如果某个关键字下没有任何条目,那么这个参数就是所产生的默认值。例如:pres.getInt("aa",0);pres为Preferences的对象。

5. 总结
java I/O流类库的确能满足我们的基本需求:我们可以通过控制台、文件、内存块,甚至因特网进行读写。通过继承,我们可以创建新类型的输入和输出对象。并且通过重新定义toString()方法,我们甚至可以对流接受的对象类型进行简单的扩充。

你可能感兴趣的:(java,编程,IO,对象序列化)