許多資料來(lái)源中都含有多余數(shù)據(jù)或?qū)Υ鎯?chǔ)信息無(wú)用的數(shù)據(jù)。這常常造成客戶機(jī) 和
服務(wù)器應(yīng)用程序間或電腦間浩如煙海的數(shù)據(jù)傳輸。很明顯,數(shù)據(jù)存儲(chǔ)和信息傳
輸問(wèn)題解決辦法是,安裝輔助存儲(chǔ)裝置并擴(kuò)展現(xiàn)有的通信設(shè)備。然而,要做到這 一點(diǎn),就需要增加組織的運(yùn)行費(fèi)用。減輕部分?jǐn)?shù)據(jù)存儲(chǔ)和信息傳輸?shù)姆椒ㄖ皇牵?
以更有效的代碼表示數(shù)據(jù)。本文簡(jiǎn)要介紹數(shù)據(jù)壓縮和解壓縮,以及如何有效地、方便地從JavaTM應(yīng)用程序內(nèi)部使用 java.util.zip包壓縮和解壓縮數(shù)據(jù)。
雖然 WinZip、gzip和Java ARchive(或 jar)等工具可以用來(lái)壓縮和解壓縮數(shù)據(jù),這些工具仍被用作獨(dú)立 的應(yīng)用程序。從
Java 應(yīng)用程序中可以調(diào)用這些工具,但并非是簡(jiǎn)捷有效的解決 方法。在希望迅速地(如在傳輸?shù)竭h(yuǎn)程機(jī)器之前)壓縮和解壓縮數(shù)據(jù)的情況下, 尤其如此。本文將:
簡(jiǎn)要綜述數(shù)據(jù)壓縮
描述java.util.zip包
介紹如何使用這些包壓縮和解壓縮數(shù)據(jù)
介紹如何壓縮和解壓縮已序列化的對(duì)象以節(jié)省磁盤空間
介紹如何迅速壓縮和解壓縮數(shù)據(jù),以提高客戶/服務(wù)器應(yīng)用程序的性能
概述數(shù)據(jù)壓縮
文件冗余最單一的類型是字符的重復(fù)。例如,下列字符串:
BBBBHHDDXXXXKKKKWWZZZZ
可以更簡(jiǎn)潔地對(duì)本字符串進(jìn)行編碼,方法是以重復(fù)字符和代表其重復(fù)次數(shù)的數(shù)
字代替每個(gè)重復(fù)字符串。因此,上述字符串可以編碼為:
4B2H2D4X4K2W4Z
這里的" 4B
"表示4個(gè)B,而2H表示2個(gè)H,等等。以這種方法壓縮字符串的編碼
方式叫做運(yùn)行長(zhǎng)度編碼。
另一個(gè)例子,是矩形圖像存儲(chǔ)。因?yàn)槭菃紊粓D圖像,所以按圖表1所示存儲(chǔ)。
screen.width-333)this.width=screen.width-333;">
圖表1∶帶運(yùn)行長(zhǎng)度編碼信息的位圖
第二種方法是將圖像存為圖解元文件∶
矩形11、3、20、5
它表示,該矩形起始坐標(biāo)是(11, 3),寬度是 20 像素,長(zhǎng)度是 5
像素。
矩形圖像可以通過(guò)計(jì)算相等字節(jié)的方式,以運(yùn)行長(zhǎng)度編碼進(jìn)行壓縮,如下:
0, 40
0,
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個(gè)0組成。第三行表示,位圖的第三行
由10個(gè)0組成,繼之以20個(gè)1、10個(gè)0組成,諸如此類。
注意,運(yùn)行長(zhǎng)度編碼要求對(duì)其文件及其編碼版本分別表示。所以,本方法不
適用于所有文件。其他的壓縮技術(shù)包括變長(zhǎng)編碼(亦稱霍夫曼編碼)和等其它編
碼。更多信息,請(qǐng)參看數(shù)據(jù)和影象壓縮技術(shù)的相關(guān)書籍。
數(shù)據(jù)壓縮的好處很多。不過(guò),基本的好處是減少存儲(chǔ)需求。此外,對(duì)于數(shù)據(jù)
通信,通過(guò)介質(zhì)傳遞壓縮數(shù)據(jù)會(huì)導(dǎo)致信息傳輸率的增加。注意,數(shù)據(jù)壓縮可以 在現(xiàn)有的硬件上通過(guò)軟件或采用結(jié)合了壓縮技術(shù)的專門硬件設(shè)備完成。圖形2顯
示了基本的數(shù)據(jù)壓縮方塊圖。
screen.width-333)this.width=screen.width-333;">
圖形2∶數(shù)據(jù)壓縮方塊圖
ZIP vs. GZIP
如果使用的是 Windows,就會(huì)很熟悉 WinZip 工具,該工具用來(lái)創(chuàng)建壓縮文
件和從壓縮文件中提取文件。不過(guò),在UNIX上,細(xì)節(jié)有些有點(diǎn)不一樣。tar 命令 用來(lái)創(chuàng)建文件(非壓縮),而另一個(gè)程序(gzip或壓縮)用來(lái)壓縮
文件。
WinZip和PKZIP之類的工具既用作歸檔器,也用 作壓縮器。它們將文件壓縮并存儲(chǔ)在文檔中。另一方面,gzip并不
存檔文件。因此,在 UNIX 上,tar命令通常用來(lái)創(chuàng)建文檔,然后 用gzip命令來(lái)壓縮存檔文件。
java.util.zip 包
Java 為兼容 zip 的數(shù)據(jù)壓縮提供 java.util.zip包。它提供
允許讀取、創(chuàng)建并修改ZIP和GZIP文件格式的類。此外,提供用于計(jì)算任意輸入流 校驗(yàn)和的應(yīng)用類,該類可用于確認(rèn)輸入數(shù)據(jù)。這個(gè)包有一個(gè)界面、14個(gè)類和2個(gè)異
常類,如表1所示。
表 1∶java.util.zip 包
項(xiàng)目 類型 描述
Checksum 界面
由Adler32和CRC32類實(shí)現(xiàn)
Adler32 類 用于計(jì)算數(shù)據(jù)流的 Adler32 檢驗(yàn)和
CheckedInputStream 類
維持正在讀取的數(shù)據(jù)檢驗(yàn)和的輸入流。
CheckedOutputStream 類 維持寫入數(shù)據(jù)的檢驗(yàn)和的輸出流。
CRC32 類 用于計(jì)算數(shù)據(jù)流的
CRC32 檢驗(yàn)和
Deflater 類 支持使用 ZLIB 壓縮庫(kù)的常規(guī)壓縮
DeflaterOutputStream 類
以緊縮壓縮格式壓縮數(shù)據(jù)的輸出流過(guò)濾器
GZIPInputStream 類 文件格式壓縮數(shù)據(jù)的輸入流過(guò)濾器。
GZIPOutputStream 類
文件格式壓縮數(shù)據(jù)的輸出流過(guò)濾器。
Inflater 類 支持使用 ZLIB 壓縮庫(kù)的常規(guī)解壓縮
InlfaterInputStream 類
解壓緊縮壓縮格式數(shù)據(jù)的輸入流過(guò)濾器
ZipEntry 類 代表ZIP壓縮文件條目
ZipFile 類 用于從ZIP文件中讀取條目
ZipInputStream 類 讀取ZIP文件格式文件的輸入流過(guò)濾器
ZipOutputStream 類
以ZIP文件格式寫入文件的輸出流過(guò)濾器
DataFormatException 異常類 給出數(shù)據(jù)格式錯(cuò)誤的信號(hào)
ZipException 異常類
給出 zip 錯(cuò)誤的信號(hào)
注意: TZLIB壓縮庫(kù)最初是作為“可移植的網(wǎng)絡(luò)圖象文件格式”(PNG)
標(biāo)準(zhǔn)的一部分進(jìn)行開發(fā)的,該標(biāo)準(zhǔn)不受專利的保護(hù)。[@more@]
新聞標(biāo)題:JavaTransactionAPI概述(轉(zhuǎn))
鏈接地址:
http://weahome.cn/article/pjecjj.html