文档介绍:使用 JavaTM API 压缩和解压缩数据
Qusay H. Mahmoud, Konstantin Kladko
2002 年 2 月
许多资料来源中都含有多余数据或对存储信息无用的数据。这常常造成客户机和服务器
应用程序间或电脑间浩如烟海的数据传输。很明显,数据存储和信息传输问题解决办法是,
安装辅助存储装置并扩展现有的通信设备。然而,要做到这一点,就需要增加组织的运行费
用。减轻部分数据存储和信息传输的方法之一是,以更有效的代码表示数据。本文简要介绍
数据压缩和解压缩,以及如何有效地、方便地从 JavaTM 应用程序内部使用 包
压缩和解压缩数据。
虽然 WinZip、gzip 和 Java ARchive(或 jar)等工具可以用来压缩和解压缩数据,这
些工具仍被用作独立的应用程序。从 Java 应用程序中可以调用这些工具,但并非是简捷有
效的解决方法。在希望迅速地(如在传输到远程机器之前)压缩和解压缩数据的情况下,尤
其如此。本文将:
♦简要综述数据压缩
♦描述 包
♦介绍如何使用这些包压缩和解压缩数据
♦介绍如何压缩和解压缩已序列化的对象以节省磁盘空间
♦介绍如何迅速压缩和解压缩数据,以提高客户/服务器应用程序的性能
♦概述数据压缩
文件冗余最单一的类型是字符的重复。例如,下列字符串:
BBBBHHDDXXXXKKKKWWZZZZ
可以更简洁地对本字符串进行编码,方法是以重复字符和代表其重复次数的数字代替每个重
复字符串。因此,上述字符串可以编码为:
4B2H2D4X4K2W4Z
这里的" 4B "表示 4 个 B,而 2H 表示 2 个 H,等等。以这种方法压缩字符串的编码方式
叫做运行长度编码。
另一个例子,是矩形图像存储。因为是单色位图图像,所以按图表1所示存储。
图表1∶带运行长度编码信息的位图
第二种方法是将图像存为图解元文件∶
矩形 11、3、20、5
它表示,该矩形起始坐标是(11, 3),宽度是 20 像素,长度是 5 像素。
矩形图像可以通过计算相等字节的方式,以运行长度编码进行压缩,如下:
0, 40
0, 40
379
0,10 1,20 0,10
0,10 1,1 0,18 1,1 0,10
0,10 1,1 0,18 1,1 0,10
0,10 1,1 0,18 1,1 0,10
0,10 1,20 0,10
0,40
上面的第一行表示,位图的第一行由 40 个 0 组成。第三行表示,位图的第三行由 10 个 0
组成,继之以 20 个 1、10 个 0 组成,诸如此类。
注意,运行长度编码要求对其文件及其编码版本分别表示。所以,本方法不适用于所有
文件。其他的压缩技术包括变长编码(亦称霍夫曼编码)和等其它编码。更多信息,请参看
数据和影象压缩技术的相关书籍。
数据压缩的好处很多。不过,基本的好处是减少存储需求。此外,对于数据通信,通过
介质传递压缩数据会导致信息传输率的增加。注意,数据压缩可以在现有的硬件上通过软件
或采用结合了压缩技术的专门硬件设备完成。图形2显示了基本的数据压缩方块图。
图形2∶数据压缩方块图
ZIP vs. GZIP
如果使用的是 Windows,就会很熟悉 WinZip 工具,该工具用来创建压缩文件和从压缩文
件中提取文件。不过,在 UNIX 上,细节有些有点不一样。tar 命令用来创建文件(非压
缩),而另一个程序(gzip 或压缩)用来压缩文件。
inZip 和 PKZIP 之类的工具既用作归档器,也用作压缩器。它们将文件压缩并存储在
文档中。另一方面,gzip 并不存档文件。因此,在 UNIX 上,tar 命令通常用来创建文档,
然后用 gzip 命令来压缩存档文件。
包
Java 为兼容 zip 的数据压缩提供 包。它提供允许读取、创建并修改 ZIP 和 GZIP
文件格式的类。此外,提供用于计算任意输入流校验和的应用类,该类可用于确认输入数据。
这个包有一个界面、14 个类和 2 个异常类,如表 1 所示。
表 1∶ 包
项目类型描述
检验和界面显示数据检验和。由 Adler32 和 CRC32 类实现
Adler32 类用于计算数据流的 Adler32 检验和
CheckedInputStream