許多資料來源中都含有多余數據或對存儲信息無用的數據。這常常造成客戶機 和服務器應用程序間或電腦間浩如煙海的數據傳輸。很明顯,數據存儲和信息傳 輸問題解決辦法是,安裝輔助存儲裝置并擴展現有的通信設備。然而,要做到這 一點,就需要增加組織的運行費用。減輕部分數據存儲和信息傳輸的方法之一是, 以更有效的代碼表示數據。本文簡要介紹數據壓縮和解壓縮,以及如何有效地、方便地從JavaTM應用程序內部使用 java.util.zip
包壓縮和解壓縮數據。
雖然 WinZip
、gzip
和Java ARchive(或 jar
)等工具可以用來壓縮和解壓縮數據,這些工具仍被用作獨立 的應用程序。從 Java 應用程序中可以調用這些工具,但并非是簡捷有效的解決 方法。在希望迅速地(如在傳輸到遠程機器之前)壓縮和解壓縮數據的情況下, 尤其如此。本文將:
- 簡要綜述數據壓縮
- 描述
java.util.zip
包 - 介紹如何使用這些包壓縮和解壓縮數據
- 介紹如何壓縮和解壓縮已序列化的對象以節省磁盤空間
- 介紹如何迅速壓縮和解壓縮數據,以提高客戶/服務器應用程序的性能
文件冗余最單一的類型是字符的重復。例如,下列字符串:
BBBBHHDDXXXXKKKKWWZZZZ
可以更簡潔地對本字符串進行編碼,方法是以重復字符和代表其重復次數的數 字代替每個重復字符串。因此,上述字符串可以編碼為:
4B2H2D4X4K2W4Z
這里的" 4B "表示4個B,而2H表示2個H,等等。以這種方法壓縮字符串的編碼 方式叫做運行長度編碼。
另一個例子,是矩形圖像存儲。因為是單色位圖圖像,所以按圖表1所示存儲。

圖表1∶帶運行長度編碼信息的位圖
第二種方法是將圖像存為圖解元文件∶
矩形11、3、20、5
它表示,該矩形起始坐標是(11, 3),寬度是 20 像素,長度是 5 像素。
矩形圖像可以通過計算相等字節的方式,以運行長度編碼進行壓縮,如下:
0, 400, 40
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
或壓縮)用來壓縮 文件。
WinZip
和PKZIP
之類的工具既用作歸檔器,也用 作壓縮器。它們將文件壓縮并存儲在文檔中。另一方面,gzip
并不 存檔文件。因此,在 UNIX 上,tar
命令通常用來創建文檔,然后 用gzip
命令來壓縮存檔文件。
Java 為兼容 zip 的數據壓縮提供 java.util.zip
包。它提供 允許讀取、創建并修改ZIP和GZIP文件格式的類。此外,提供用于計算任意輸入流 校驗和的應用類,該類可用于確認輸入數據。這個包有一個界面、14個類和2個異 常類,如表1所示。
項目 | 類型 | 描述 |
---|---|---|
Checksum | 界面 | 由Adler32 和CRC32 類實現 |
Adler32 | 類 | 用于計算數據流的 Adler32 檢驗和 |
CheckedInputStream | 類 | 維持正在讀取的數據檢驗和的輸入流。 |
CheckedOutputStream | 類 | 維持寫入數據的檢驗和的輸出流。 |
CRC32 | 類 | 用于計算數據流的 CRC32 檢驗和 |
Deflater | 類 | 支持使用 ZLIB 壓縮庫的常規壓縮 |
DeflaterOutputStream | 類 | 以緊縮壓縮格式壓縮數據的輸出流過濾器 |
GZIPInputStream | 類 | 文件格式壓縮數據的輸入流過濾器。 |
GZIPOutputStream | 類 | 文件格式壓縮數據的輸出流過濾器。 |
Inflater | 類 | 支持使用 ZLIB 壓縮庫的常規解壓縮 |
InlfaterInputStream | 類 | 解壓緊縮壓縮格式數據的輸入流過濾器 |
ZipEntry | 類 | 代表ZIP壓縮文件條目 |
ZipFile | 類 | 用于從ZIP文件中讀取條目 |
ZipInputStream | 類 | 讀取ZIP文件格式文件的輸入流過濾器 |
ZipOutputStream | 類 | 以ZIP文件格式寫入文件的輸出流過濾器 |
DataFormatException | 異常類 | 給出數據格式錯誤的信號 |
ZipException | 異常類 | 給出 zip 錯誤的信號 |
注意: TZLIB壓縮庫最初是作為“可移植的網絡圖象文件格式”(PNG) 標準的一部分進行開發的,該標準不受專利的保護。