友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
狗狗书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

Java编程思想第4版[中文版](PDF格式)-第142章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




些文件合并到一个 JAR 文件里以后,只需向远程服务器发出一次请求即可。同时,由于采用了压缩技术,所 

以可在更短的时间里获得全部数据。另外,JAR 文件里的每个入口(条目)都可以加上数字化签名(详情参 

考Java 用户文档)。  

一个JAR 文件由一系列采用 Zip 压缩格式的文件构成,同时还有一张“详情单”,对所有这些文件进行了描 

述(可创建自己的详情单文件;否则,jar程序会为我们代劳)。在联机用户文档中,可以找到与JAR 详情 

单更多的资料(详情单的英语是“Manifest ”)。  

jar 实用程序已与Sun 的JDK 配套提供,可以按我们的选择自动压缩文件。请在命令行调用它:  

  

jar '选项' 说明 '详情单' 输入文件  

  

其中,“选项”用一系列字母表示(不必输入连字号或其他任何指示符)。如下所示:  

  

c 创建新的或空的压缩档  

t 列出目录表  



                                                                                 314 


…………………………………………………………Page 316……………………………………………………………

x 解压所有文件  

x file 解压指定文件  

f 指出“我准备向你提供文件名”。若省略此参数,jar 会假定它的输入来自标准输入;或者在它创建文件 

时,输出会进入标准输出内  

m 指出第一个参数将是用户自建的详情表文件的名字  

v 产生详细输出,对 jar做的工作进行巨细无遗的描述  

O 只保存文件;不压缩文件(用于创建一个 JAR 文件,以便我们将其置入自己的类路径中)  

M 不自动生成详情表文件  

  

在准备进入 JAR 文件的文件中,若包括了一个子目录,那个子目录会自动添加,其中包括它自己的所有子目 

录,以此类推。路径信息也会得到保留。  

下面是调用 jar 的一些典型方法:  

  

jar cf myJarFile。jar *。class  

用于创建一个名为myJarFile。jar 的JAR 文件,其中包含了当前目录中的所有类文件,同时还有自动产生的 

详情表文件。  

  

jar cmf myJarFile。jar myManifestFile。mf *。class  

与前例类似,但添加了一个名为myManifestFile。mf 的用户自建详情表文件。  

  

jar tf myJarFile。jar  

生成myJarFile。jar 内所有文件的一个目录表。  

  

jar tvf myJarFile。jar  

添加“verbose”(详尽)标志,提供与myJarFile。jar 中的文件有关的、更详细的资料。  

  

jar cvf myApp。jar audio classes image  

假定audio,classes 和 image 是子目录,这样便将所有子目录合并到文件myApp。jar 中。其中也包括了 

 “verbose”标志,可在jar 程序工作时反馈更详尽的信息。  

  

如果用O 选项创建了一个JAR 文件,那个文件就可置入自己的类路径(CLASSPATH)中:  

CLASSPATH=〃lib1。jar;lib2。jar;〃  

Java 能在 lib1。jar 和 lib2。jar 中搜索目标类文件。  

  

jar工具的功能没有zip 工具那么丰富。例如,不能够添加或更新一个现成 JAR 文件中的文件,只能从头开 

始新建一个 JAR 文件。此外,不能将文件移入一个 JAR 文件,并在移动后将它们删除。然而,在一种平台上 

创建的 JAR 文件可在其他任何平台上由jar工具毫无阻碍地读出(这个问题有时会困扰zip 工具)。  

正如大家在第 13 章会看到的那样,我们也用JAR 为Java Beans 打包。  



10。9 对象序列化  



Java 1。1 增添了一种有趣的特性,名为“对象序列化”(Object Serialization)。它面向那些实现了 

Serializable 接口的对象,可将它们转换成一系列字节,并可在以后完全恢复回原来的样子。这一过程亦可 

通过网络进行。这意味着序列化机制能自动补偿操作系统间的差异。换句话说,可以先在Windows 机器上创 

建一个对象,对其序列化,然后通过网络发给一台 Unix 机器,然后在那里准确无误地重新“装配”。不必关 

心数据在不同机器上如何表示,也不必关心字节的顺序或者其他任何细节。  

就其本身来说,对象的序列化是非常有趣的,因为利用它可以实现“有限持久化”。请记住“持久化”意味 

着对象的“生存时间”并不取决于程序是否正在执行——它存在或“生存”于程序的每一次调用之间。通过 

序列化一个对象,将其写入磁盘,以后在程序重新调用时重新恢复那个对象,就能圆满实现一种“持久”效 

果。之所以称其为“有限”,是因为不能用某种“persistent”(持久)关键字简单地地定义一个对象,并 

让系统自动照看其他所有细节问题(尽管将来可能成为现实)。相反,必须在自己的程序中明确地序列化和 

组装对象。  

语言里增加了对象序列化的概念后,可提供对两种主要特性的支持。Java 1。1 的“远程方法调用”(RMI) 



                                                                           315 


…………………………………………………………Page 317……………………………………………………………

使本来存在于其他机器的对象可以表现出好象就在本地机器上的行为。将消息发给远程对象时,需要通过对 

象序列化来传输参数和返回值。RMI 将在第 15章作具体讨论。  

对象的序列化也是 Java Beans 必需的,后者由Java 1。1 引入。使用一个Bean 时,它的状态信息通常在设计 

期间配置好。程序启动以后,这种状态信息必须保存下来,以便程序启动以后恢复;具体工作由对象序列化 

完成。  

对象的序列化处理非常简单,只需对象实现了 Serializable 接口即可(该接口仅是一个标记,没有方法)。 

在Java 1。1 中,许多标准库类都发生了改变,以便能够序列化——其中包括用于基本数据类型的全部封装 

器、所有集合类以及其他许多东西。甚至 Class 对象也可以序列化(第 11章讲述了具体实现过程)。  

为序列化一个对象,首先要创建某些OutputStream 对象,然后将其封装到 ObjectOutputStream 对象内。此 

时,只需调用writeObject() 即可完成对象的序列化,并将其发送给OutputStream。相反的过程是将一个 

InputStream封装到 ObjectInputStream 内,然后调用readObject()。和往常一样,我们最后获得的是指向 

一个上溯造型Object 的句柄,所以必须下溯造型,以便能够直接设置。  

对象序列化特别“聪明”的一个地方是它不仅保存了对象的“全景图”,而且能追踪对象内包含的所有句柄 

并保存那些对象;接着又能对每个对象内包含的句柄进行追踪;以此类推。我们有时将这种情况称为“对象 

网”,单个对象可与之建立连接。而且它还包含了对象的句柄数组以及成员对象。若必须自行操纵一套对象 

序列化机制,那么在代码里追踪所有这些链接时可能会显得非常麻烦。在另一方面,由于Java 对象的序列化 

似乎找不出什么缺点,所以请尽量不要自己动手,让它用优化的算法自动维护整个对象网。下面这个例子对 

序列化机制进行了测试。它建立了许多链接对象的一个“Worm ”(蠕虫),每个对象都与Worm 中的下一段链 

接,同时又与属于不同类(Data )的对象句柄数组链接:  

  

//: Worm。java  

// Demonstrates object serialization in Java 1。1  

import java。io。*;  

  

class Data implements Serializable {  

  private int i;  

  Data(int x) { i = x; }  

  public String toString() {  

    return Integer。toString(i);  

  }  

}  

  

public class Worm implements Serializable {  

  // Generate a random int value:  

  private static int r() {  

    return (int)(Math。random() * 10);  

  }  

  private Data'' d = {  

    new Data(r()); new Data(r()); new Data(r())  

  };  

  private Worm next;  
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!