文件壓縮與解壓縮實(shí)踐Java_第1頁(yè)
文件壓縮與解壓縮實(shí)踐Java_第2頁(yè)
文件壓縮與解壓縮實(shí)踐Java_第3頁(yè)
文件壓縮與解壓縮實(shí)踐Java_第4頁(yè)
文件壓縮與解壓縮實(shí)踐Java_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、成都信息工程學(xué)院學(xué)位論文文件壓縮與解壓縮實(shí)踐論文作者姓名:袁淵申請(qǐng)學(xué)位專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)申請(qǐng)學(xué)位類別:工學(xué)學(xué)士指導(dǎo)教師姓名(職稱):葉安勝(講師)論文提交日期:2007年 6月10日文件壓縮與解壓縮實(shí)踐摘 要隨著人們對(duì)數(shù)據(jù)的大量需求以及計(jì)算機(jī)使用時(shí)間的增加,計(jì)算機(jī)磁盤上的文件越來(lái)越大,越來(lái)越多。如何讓有限的磁盤空間容納更多的數(shù)據(jù)成為需要解決的問(wèn)題。一方面,高速發(fā)展的存儲(chǔ)技術(shù)以提高磁盤容量來(lái)解決這樣的需求,但隨著網(wǎng)絡(luò)環(huán)境下數(shù)據(jù)傳遞的產(chǎn)生以及帶寬的限制,大容量數(shù)據(jù)問(wèn)題日益突出。在這兩種需求的推動(dòng)下,對(duì)數(shù)據(jù)壓縮的需求產(chǎn)生了。人們可以將文件在不改變其本身的條件下,將其以更小的占用空間存儲(chǔ),并且在需

2、要的時(shí)候?qū)⑽募謴?fù)成原有的樣子,這就是壓縮目的。本論文主要研究文件的無(wú)損壓縮技術(shù),并簡(jiǎn)要介紹了文件壓縮的分類、幾種常用的無(wú)損壓縮格式和常用的壓縮算法。運(yùn)用LZ77字典算法、懶惰匹配算法和Huffman編碼算法,使用Java語(yǔ)言在Jbuilder2006環(huán)境下設(shè)計(jì)了使用GZIP算法對(duì)文件壓縮與解壓縮的實(shí)現(xiàn)程序。用戶可以根據(jù)自己的需求,使用此程序方便地對(duì)文件進(jìn)行壓縮或者解壓縮操作。關(guān)鍵詞:壓縮;解壓縮;GZIP;Java目 錄論文總頁(yè)數(shù):21頁(yè)1引言11.1課題背景11.2國(guó)內(nèi)外現(xiàn)有的研究成果12壓縮與解壓縮程序分析22.1需求分析22.2使用的算法理論22.2.1LZ77算法簡(jiǎn)介22.2.2Hu

3、ffman算法簡(jiǎn)介32.2.3GZIP算法原理分析42.3開發(fā)環(huán)境43總體設(shè)計(jì)43.1程序功能模塊53.2模塊分析與流程圖53.2.1壓縮模塊53.2.2解壓縮模塊63.3程序中各個(gè)類的初步定義74詳細(xì)設(shè)計(jì)和實(shí)現(xiàn)84.1壓縮的程序流程84.2解壓縮的程序流程94.3主函數(shù)代碼104.3.1gzip壓縮模塊代碼104.3.2ungzip解壓縮模塊代碼114.4程序界面設(shè)計(jì)125軟件系統(tǒng)測(cè)試175.1運(yùn)行環(huán)境175.2測(cè)試方法175.3測(cè)試結(jié)果175.3.1使用程序?qū)xt文件壓縮175.3.2使用程序?qū)mp圖象文件壓縮185.3.3使用程序?qū)oc文件壓縮18結(jié) 論18參考文獻(xiàn)19致 謝20聲

4、 明211 引言1.1 課題背景隨著科學(xué)技術(shù)的進(jìn)步,信息技術(shù)越來(lái)越廣泛地應(yīng)用到社會(huì)的各個(gè)行業(yè)和領(lǐng)域,互聯(lián)網(wǎng)深刻地改變著人們的生活方式,推動(dòng)著人類文明的進(jìn)步。伴隨著信息技術(shù)的普及和發(fā)展,互聯(lián)網(wǎng)技術(shù)覆蓋了社會(huì)政治、經(jīng)濟(jì)、文化、生產(chǎn)的各個(gè)領(lǐng)域,這種普及日常生活和工作更加的方便、文化娛樂(lè)方式更加的多樣化。但是,在信息技術(shù)的飛速發(fā)展下,文件的信息量不斷增加的背景下,文件的存儲(chǔ)和拷貝要求能夠保持?jǐn)?shù)據(jù)的意思不變的情況下縮小容量,這就需要有壓縮與解壓縮來(lái)實(shí)現(xiàn)這個(gè)過(guò)程。本論文通過(guò)對(duì)一種壓縮與解壓縮方法的實(shí)踐,對(duì)這種算法的實(shí)現(xiàn)過(guò)程進(jìn)行研究。1.2 國(guó)內(nèi)外現(xiàn)有的研究成果文件壓縮格式現(xiàn)在已有許多種,最流行的有如下幾種

5、:ZIP:我們可以利用WinZip對(duì)ZIP文件進(jìn)行解壓、釋放等操作,還可以用它來(lái)處理ARJ、ARC、CAB、LZH等多種不同格式的壓縮文件,從而大大地方便了用戶的操作。RAR:是一種高效快速的文件壓縮格式,但不被大多數(shù)文件壓縮程序支持,WinRAR是在Windows下處理RAR格式文件的最好工具。ARJ:由DOS下曾經(jīng)紅極一時(shí)的壓縮軟件ARJ壓縮而成的文件格式,它具有功能強(qiáng)大、壓縮率高等優(yōu)點(diǎn)。到了現(xiàn)在的Windows時(shí)代,它已經(jīng)沒(méi)有了往日的輝煌。CAB:是Windows 98新增的一種特殊壓縮文件格式,主要用于對(duì)有關(guān)軟件安裝盤中的文件進(jìn)行壓縮,其特點(diǎn)是壓縮率非常高(可能是目前最高的),但一經(jīng)壓

6、縮就不能再進(jìn)行任何增加、刪除、替換等修改,也就是說(shuō)它的壓縮包具有“只讀”屬性。我們也可使用WinZip對(duì)CAB壓縮包進(jìn)行操作。UU/UUE:漢字編碼方式,它們?cè)臼荱nix系統(tǒng)中使用的一種編碼方式,后來(lái)被改寫到DOS中,我們?cè)趥魉椭形泥]件時(shí)只須事先使用該方式進(jìn)行編碼,此后就能順利通過(guò)只能處理7位編碼的郵件服務(wù)器,從而解決了漢字的傳輸問(wèn)題。ACE:一種新式的壓縮程序,壓縮比很高。以上的壓縮格式是可逆的,在解壓縮之后,可以將被壓縮的文件還原成以前未壓縮的文件。另外還有一種不可逆的壓縮格式,如MP3、MPEG、JPG等音頻、視頻、圖像格式的文件都采用了這種壓縮技術(shù),從理論上來(lái)說(shuō)它們也應(yīng)該算壓縮文件,

7、不過(guò)它們所采用的壓縮方式與前面講的并不相同,這里簡(jiǎn)單地介紹一下:JPEG:JPEG 全名為 Joint Photographic Experts Group,它是一個(gè)在國(guó)際標(biāo)準(zhǔn)組織(ISO)下從事靜態(tài)影像壓縮標(biāo)準(zhǔn)制定的委員會(huì)。它制定出了第一套國(guó)標(biāo)靜態(tài)影像壓縮標(biāo)準(zhǔn):ISO 10918-1 就是我們俗稱的JPEG了。由于JPEG優(yōu)良的品質(zhì),使得它在短短的幾年內(nèi)就獲得極大的成功,目前網(wǎng)站上80%的影像都是采用JPEG的壓縮標(biāo)準(zhǔn)。JPEG 2000:正式名稱為“ISO 15444”,同樣是由JPEG組織負(fù)責(zé)制定。JPEG 2000與傳統(tǒng)JPEG最大的不同,在于它放棄了JPEG所采用的以離散余弦轉(zhuǎn)換為主

8、的區(qū)塊編碼方式,而改以小波轉(zhuǎn)換為主的多解析編碼方式。其壓縮率比JPEG高約30%左右,同時(shí)支持有損和無(wú)損壓縮,無(wú)損壓縮對(duì)保存一些重要圖片十分有用。MP3:MP3全稱是MPEG 1 Layer 3,是一種高性能的聲音壓縮編碼方案,它可以做出超小“體積”的音樂(lè)文件,大小只是原始音頻數(shù)據(jù)的1/10到1/12。但人耳聽起來(lái),效果卻沒(méi)有太大差異。MPEG:MPEG是Moving Pictures Experts Group(動(dòng)態(tài)圖像專家組)的縮寫?,F(xiàn)在使用的有4個(gè)版本:MPEG-1、MPEG-2、MPEG-3、MPEG-4。2 壓縮與解壓縮程序分析2.1 需求分析文件的壓縮與解壓縮,要能方便地進(jìn)行,要完

9、成的功能包括壓縮功能,解壓縮功能,選擇文件路徑,選擇操作方案,選擇新文件保存路徑。此程序還要在壓縮成功后顯示被壓縮文件的大小,并對(duì)非法操作給出提示。用戶可以選擇文件進(jìn)行壓縮或解壓縮操作,并選擇生成保存路徑,默認(rèn)的保存路徑為原文件目錄,壓縮的生成文件以原文件加.gzip后綴命名,在解壓縮操作中,若輸入文件不是gzip格式的壓縮文件,則提示gzip文件格式不對(duì)。程序的基本設(shè)計(jì)原則有:方便性原則、功能實(shí)用性原則和開放性原則等。程序設(shè)計(jì)時(shí)采用較好的壓縮技術(shù),能保證文件壓縮的壓縮比和可恢復(fù)性,確保程序有較長(zhǎng)的生命周期。本程序的總體目標(biāo)是實(shí)現(xiàn)文件壓縮與解壓縮的便捷操作,因此需要有便捷的操作界面。2.2 使

10、用的算法理論2.2.1 LZ77算法簡(jiǎn)介這一算法是由Jacob Ziv和Abraham Lempel于 1977 年提出,所以命名為L(zhǎng)Z77。這種算法模型也被稱為“滑動(dòng)字典”模型或“滑動(dòng)窗口”模型。壓縮的模型如圖1:圖1 壓縮中的LZ77算法模型圖在最遠(yuǎn)匹配位置和當(dāng)前處理位置之間是可以用來(lái)查找匹配的“字典”區(qū)域,隨著壓縮的進(jìn)行,“字典”區(qū)域從待壓縮文件的頭部不斷地向后滑動(dòng),直到達(dá)到文件的尾部,短語(yǔ)式壓縮也就結(jié)束了。解壓縮的模型如圖2:圖2 解壓縮中的LZ77算法模型圖2.2.2 Huffman算法簡(jiǎn)介David Albert Huffman(哈夫曼/赫夫曼/霍夫曼)在MIT攻讀博士學(xué)位期間于1

11、952年提出了一種從下到上的編碼方法,現(xiàn)在被稱為Huffman編碼,它是一種統(tǒng)計(jì)最優(yōu)的變碼長(zhǎng)符號(hào)編碼,讓最頻繁出現(xiàn)的符號(hào)具有最短的編碼。Huffman編碼的過(guò)程具體編碼步驟為:(1)將符號(hào)按概率從小到大順序從左至右排列葉節(jié)點(diǎn);(2)連接兩個(gè)概率最小的頂層節(jié)點(diǎn)來(lái)組成一個(gè)父節(jié)點(diǎn),并在到左右子節(jié)點(diǎn)的兩條連線上分別標(biāo)記0和1;(3)重復(fù)步驟2,直到得到根節(jié)點(diǎn),形成一棵二叉樹;(4)從根節(jié)點(diǎn)開始到相應(yīng)于每個(gè)符號(hào)的葉節(jié)點(diǎn)的0/1串,就是該符號(hào)的二進(jìn)制編碼。由于符號(hào)按概率大小的排列既可以從左至右、又可以從右至左,而且左右分枝哪個(gè)標(biāo)記為0哪個(gè)標(biāo)記為1是無(wú)關(guān)緊要的,所以最后的編碼結(jié)果可能不唯一,但這僅僅是分配的

12、代碼不同,而代碼的平均長(zhǎng)度是相同的。編碼式壓縮利用各個(gè)單字節(jié)使用頻率不一樣的傾向,使定長(zhǎng)編碼變?yōu)椴欢ㄩL(zhǎng)編碼,給使用頻率高的字節(jié)更短的編碼,使用頻率低的字節(jié)更長(zhǎng)的編碼,起到壓縮的效果。由于Huffman編碼為根結(jié)點(diǎn)到葉子結(jié)點(diǎn)路徑上的0和1的序列,而一個(gè)葉子結(jié)點(diǎn)的路徑不可能是另一個(gè)葉子結(jié)點(diǎn)路徑的前綴,因此一個(gè)Huffman編碼不可能為另一個(gè)Huffman編碼的前綴,這就保證了Huffman編碼是可以區(qū)分的。由于用Huffman算法建立起來(lái)的樹總是一棵最優(yōu)二叉樹,因此這又讓Huffman編碼能夠?qū)嶋H應(yīng)用到壓縮中。2.2.3 GZIP算法原理分析GZIP使用deflate算法進(jìn)行壓縮。zlib,以及圖

13、形格式png,使用的壓縮算法也是deflate算法。GZIP對(duì)于要壓縮的文件,首先使用LZ77算法的一個(gè)變種進(jìn)行壓縮,對(duì)得到的結(jié)果再使用Huffman編碼的方法(GZIP根據(jù)情況,選擇使用靜態(tài)Huffman編碼或者動(dòng)態(tài)Huffman編碼)進(jìn)行壓縮。LZ77算法和Huffman編碼結(jié)合起來(lái),就是deflate算法的根本實(shí)現(xiàn)方法,也就是GZIP的壓縮原理。懶惰匹配(lazy match)是GZIP中對(duì)LZ77算法的改進(jìn),實(shí)現(xiàn)過(guò)程如下:在壓縮過(guò)程中,對(duì)于當(dāng)前字節(jié)開始的串,尋找到了最長(zhǎng)匹配之后,GZIP并不立即決定使用這個(gè)串進(jìn)行替換。而是看看這個(gè)匹配長(zhǎng)度是否滿意,如果匹配長(zhǎng)度不滿意,而下一個(gè)字節(jié)開始的

14、串也有匹配串的話,那么GZIP就找到下一個(gè)字節(jié)開始的串的最長(zhǎng)匹配,看看是不是比現(xiàn)在這個(gè)長(zhǎng)。這就是懶惰匹配。如果比現(xiàn)在這個(gè)長(zhǎng)的話,將不使用現(xiàn)在的這個(gè)匹配。如果比現(xiàn)在這個(gè)短的話,將確定使用現(xiàn)在的這個(gè)匹配。發(fā)現(xiàn)第二次匹配的匹配長(zhǎng)度大,就不使用第一次的匹配串。如果直接使用第一次匹配的話,有可能將錯(cuò)過(guò)更長(zhǎng)的匹配串。在滿足懶惰匹配的前提條件下,懶惰匹配不限制次數(shù),一次懶惰匹配發(fā)現(xiàn)了更長(zhǎng)的匹配串之后,仍會(huì)再進(jìn)行懶惰匹配,如果這次懶匹配,發(fā)現(xiàn)了更長(zhǎng)的匹配串,那么上一次的懶匹配找到的匹配串就不用了。進(jìn)行懶惰匹配是有條件的。進(jìn)行懶惰匹配必須滿足兩個(gè)條件,第一,下一個(gè)處理字節(jié)開始的串,要有匹配串,如果下一個(gè)處理字節(jié)

15、開始的串沒(méi)有匹配串的話,那么就確定使用當(dāng)前的匹配串,不進(jìn)行懶惰匹配。第二,當(dāng)前匹配串的匹配長(zhǎng)度,GZIP不滿意,也就是當(dāng)前匹配長(zhǎng)度小于max_lazy_match(max_lazy_match在固定的壓縮級(jí)別下,有固定的值)。2.3 開發(fā)環(huán)境使用JBuilder2006進(jìn)行程序開發(fā)。JBuilder是一個(gè)可視化JAVA開發(fā)工具。它是在Java2平臺(tái)上開發(fā)商業(yè)應(yīng)用程序、數(shù)據(jù)庫(kù)、發(fā)布程序的優(yōu)秀工具。它支持J2EE,所以程序員可以快速的轉(zhuǎn)換企業(yè)版Java應(yīng)用程序。使用此開發(fā)工具可以實(shí)現(xiàn)程序的可視化。3 總體設(shè)計(jì)系統(tǒng)總體結(jié)構(gòu)設(shè)計(jì)是系統(tǒng)設(shè)計(jì)過(guò)程中及其重要的一步,對(duì)系統(tǒng)的技術(shù)層次,開發(fā)過(guò)程,功能實(shí)現(xiàn)及開發(fā)

16、成本方面具有重大的影響。系統(tǒng)總統(tǒng)結(jié)構(gòu)設(shè)計(jì)應(yīng)盡可能的考慮人機(jī)關(guān)系,環(huán)境條件以及算法的可行性等的聯(lián)系,使系統(tǒng)每個(gè)部分都能協(xié)調(diào)適應(yīng)。本實(shí)驗(yàn)論證是基于GZIP算法理論體系的,因此使用的壓縮方法是參照GZIP算法的。GZIP算法理論體系主要包含三個(gè)內(nèi)容:LZ77算法,Huffman算法,懶惰匹配算法。因此在設(shè)計(jì)過(guò)程中要注意如何實(shí)現(xiàn)這三個(gè)算法并且將其結(jié)合起來(lái)。3.1 程序功能模塊根據(jù)設(shè)計(jì)思路,文件的壓縮和解壓縮是兩個(gè)相反的操作,程序可分為GZIP壓縮模塊、UNGZIP壓縮模塊?,F(xiàn)在設(shè)計(jì)出功能結(jié)構(gòu)圖如圖3。壓縮與解壓縮程序壓縮程序解壓縮程序圖3 功能結(jié)構(gòu)圖3.2 模塊分析與流程圖分析程序的總體流程圖可以以圖

17、4來(lái)表示:NY圖4 總體流程圖3.2.1 壓縮模塊壓縮模塊的實(shí)現(xiàn)流程為:(1)打開要壓縮的文件,使用字典算法掃描文件統(tǒng)計(jì)文件使用的字符集并統(tǒng)計(jì)每個(gè)字符集的使用次數(shù)。(2)根據(jù)掃描的結(jié)果構(gòu)建文件字符集的Huffman樹。(3)由文件的Huffman樹求字符集中各字符的編碼,形成Huffman編碼表。(4)建立壓縮文件。(5)將要壓縮文件的字符集大小和文件的大小寫入壓縮文件。將字符集的Huffman樹寫入壓縮文件,供解壓縮時(shí)使用。(6)從文件中讀取一個(gè)字符集,查Huffman編碼表,得到它的Huffman編碼。按位流放入壓縮文件的寫緩沖區(qū)。(7)檢查壓縮文件的寫緩沖區(qū),如果已滿一個(gè)字節(jié),寫入壓縮文

18、件,如果要壓縮的文件沒(méi)有達(dá)到文件的結(jié)尾,轉(zhuǎn)到步驟6。(8)關(guān)閉要壓縮文件和壓縮文件畫出流程圖如圖5:圖5圖5 壓縮模塊流程圖3.2.2 解壓縮模塊解壓縮模塊的實(shí)現(xiàn)流程為:(1)打開壓縮文件,讀取字符集字符個(gè)數(shù)和文件的字節(jié)數(shù)。讀入文件的Huffman樹。(2)建立解壓縮文件。(3)讀入一個(gè)字節(jié)的編碼,用Huffman樹得到字符,將字符寫入解壓縮文件,如果編碼已用完,就讀取下一個(gè)字節(jié),如此重復(fù),直到讀取壓縮文件的全部編碼。(4)關(guān)閉壓縮文件和解壓縮文件。畫出流程圖如圖6:圖6 解壓縮模塊流程圖3.3 程序中各個(gè)類的初步定義為了完成此程序,應(yīng)當(dāng)設(shè)計(jì)一個(gè)接口,十四個(gè)類,和二個(gè)異常處理類。其中接口:Ch

19、ecksum。類:Adler32;CRC32;CheckedInputStream;CheckedOutputStream;Deflater;DeflaterOutputStream;GZIPInputStream;GZIPOutputStream;Inflater;InflaterInputStream;ZipEntry;ZipFile;ZipInputStream;ZipOutputStream。異常索引:DataFormatException;ZipException。各個(gè)類的簡(jiǎn)單介紹如表1:表1:程序各個(gè)類的作用條目類型描述Checksum接口被類Adler32和CRC32實(shí)現(xiàn)的接口A

20、dler32類使用Alder32算法來(lái)計(jì)算Checksum數(shù)目CheckedInputStream類一個(gè)輸入流,保存著被讀取數(shù)據(jù)的ChecksumCheckedOutputStream類一個(gè)輸出流,保存著被讀取數(shù)據(jù)的ChecksumCRC32類使用CRC32算法來(lái)計(jì)算Checksum數(shù)目Deflater類使用ZLIB壓縮類,支持通常的壓縮方式,程序核心類DeflaterOutputStream類一個(gè)輸出過(guò)濾流,用來(lái)壓縮Deflater格式數(shù)據(jù)GZIPInputStream類一個(gè)輸入過(guò)濾流,讀取GZIP格式壓縮數(shù)據(jù)GZIPOutputStream類一個(gè)輸出過(guò)濾流,讀取GZIP格式壓縮數(shù)據(jù)Infl

21、ater類使用ZLIB壓縮類,支持通常的解壓方式,程序核心類InflaterInputStream類一個(gè)輸入過(guò)濾流,用來(lái)解壓Inflater格式的壓縮數(shù)據(jù)ZipEntry類存儲(chǔ)ZIP條目ZipFile類從ZIP文件中讀取ZIP條目ZipInputStream類一個(gè)輸入過(guò)濾流,用來(lái)讀取ZIP格式文件中的文件ZipOutputStream類一個(gè)輸出過(guò)濾流,用來(lái)向ZIP格式文件口寫入文件DataFormatException異常類拋出一個(gè)數(shù)據(jù)格式錯(cuò)誤ZipException異常類拋出一個(gè)ZIP文件4 詳細(xì)設(shè)計(jì)和實(shí)現(xiàn)4.1 壓縮的程序流程壓縮程序的實(shí)現(xiàn)過(guò)程中,涉及到很多類的調(diào)用,除了壓縮有關(guān)的類,還有

22、IO類。對(duì)于IO類的調(diào)用不考慮的情況下,各個(gè)壓縮功能類的調(diào)用流程(如圖7):(1)主程序gzip調(diào)用輸出過(guò)濾流GZIPOutputStream,讀取GZIP格式壓縮數(shù)據(jù),壓縮開始。(2)GZIPOutputStream調(diào)用CRC32來(lái)計(jì)算Checksum的數(shù)目。(3)在CRC32返回結(jié)果后,GZIPOutputStream調(diào)用Deflater壓縮類來(lái)進(jìn)行壓縮。在Deflater類的調(diào)用過(guò)程中,實(shí)現(xiàn)了對(duì)數(shù)據(jù)的壓縮字符集確定與編碼,也就是實(shí)現(xiàn)了LZ77算法、懶惰匹配與Huffman編碼的結(jié)合。(4)建立壓縮文件,調(diào)用DeflaterOutputStream來(lái)壓縮Deflater格式數(shù)據(jù)。CRC32

23、GZIPOutputStreamgzipDeflaterDeflaterOutputStreamChecksum圖7 壓縮類的調(diào)用順序圖這些過(guò)程的操作是不能離開IO類的,所以實(shí)現(xiàn)這些過(guò)程的前提是要有數(shù)據(jù)流輸入,也就是調(diào)用FileInputStream,打開需壓縮文件作為文件輸入流;在以上的流程完畢之后,調(diào)用FileOutputStream類建立壓縮文件輸出流,最終形成壓縮后的文件。4.2 解壓縮的程序流程在解壓縮的實(shí)現(xiàn)過(guò)程中,各個(gè)類的調(diào)用關(guān)系(如圖8):(1)主程序ungzip調(diào)用GZIPInputStream,讀取GZIP格式壓縮數(shù)據(jù),解壓縮開始。(2)GZIPInputStream調(diào)用CR

24、C32來(lái)計(jì)算Checksum的數(shù)目。(3)在CRC32返回結(jié)果后,調(diào)用CheckedInputStream保存被讀取數(shù)據(jù)的Checksum,同時(shí)調(diào)用Inflater進(jìn)行解壓縮。(4)在Inflater解壓縮過(guò)程中,如果數(shù)據(jù)格式錯(cuò)誤,則調(diào)用DataFormatException;如果沒(méi)有數(shù)據(jù)格式錯(cuò)誤,則調(diào)用InflaterInputStream來(lái)解壓Inflater格式的壓縮數(shù)據(jù)。GZIPInputStreamCheckedInputStreamChecksumCRC32ChecksumungzipInflaterInputStreamInflaterDataFormatExceptionZip

25、Exception圖8 解壓縮類的調(diào)用順序圖4.3 主函數(shù)代碼4.3.1 gzip壓縮模塊代碼壓縮模塊要完成的就是將文件讀入以后進(jìn)行壓縮,再將壓縮后的數(shù)據(jù)寫入一個(gè)新的文件,其部分代碼如下:public class gzip public static void main(String args) if (args.length !=2) System.out.println("Usage:java gzip "); System.exit(1); try /打開需壓縮文件作為文件輸入流 FileInputStream fin=new FileInputStream(args

26、0); /建立壓縮文件輸出流 FileOutputStream fout=new FileOutputStream(args1); /建立gzip壓縮輸出流 GZIPOutputStream gzout=new GZIPOutputStream(fout); byte buf=new byte1024;/設(shè)定讀入緩沖區(qū)尺寸 int num; while (num=fin.read(buf) != -1) gzout.write(buf,0,num); gzout.close();/關(guān)閉流,必須關(guān)閉所有輸入輸出流.保證輸入輸出完整和釋放系統(tǒng)資源. fout.close(); fin.close(

27、); catch(IOException e) System.out.println(e); 4.3.2 ungzip解壓縮模塊代碼解壓縮模塊要完成的就是將文件讀入以后進(jìn)行解壓縮,再將解壓縮后的數(shù)據(jù)寫入一個(gè)新的文件,其部分代碼如下:public class ungzip public static void main(String args) if (args.length !=2) System.out.println("Usage:java ungzip "); System.exit(1); try /建立gzip壓縮文件輸入流 FileInputStream fin

28、=new FileInputStream(args0); /建立gzip解壓工作流 GZIPInputStream gzin=new GZIPInputStream(fin); /建立解壓文件輸出流 FileOutputStream fout=new FileOutputStream(args1); byte buf=new byte1024; int num; while (num=gzin.read(buf,0,buf.length) != -1) fout.write(buf,0,num); gzin.close(); fout.close(); fin.close(); catch(I

29、OException e) System.out.println(e); 4.4 程序界面設(shè)計(jì)為了讓用戶能便捷地進(jìn)行壓縮與解壓縮的操作,還要對(duì)程序加入一個(gè)可視化界面。其外觀如圖9:圖9 gzip壓縮與解壓縮程序界面用戶首先選擇需要操作的文件,若要將被操作文件的生成文件保存到原文件所在目錄,可以跳過(guò)選擇輸出文件夾操作。如圖10:圖10 gzip壓縮與解壓縮程序選擇文件界面在選擇好文件以后,用戶根據(jù)自己的需要,點(diǎn)擊壓縮或者解壓按鈕,操作便完成。其部分代碼如下:public class gzipJFrame extends javax.swing.JFrame implements ActionLi

30、stener File file=null;File dir=null;private JToggleButton jToggleButton1;private JMenu jMenu1;private JMenuItem jMenuItem1;private JLabel jLabel2;private JLabel jLabel1;private JMenuItem jMenuItem2;private JMenuBar jMenuBar1;private JToggleButton jToggleButton2;private static final String initstate=

31、"請(qǐng)先選擇文件"JFileChooser chooserfile=new JFileChooser();JFileChooser chooserDir=new JFileChooser();private JMenuItem jMenuItem3;/* Auto-generated main method to display this JFrame*/public static void main(String args) gzipJFrame inst = new gzipJFrame();inst.setVisible(true);public gzipJFrame(

32、) super();initGUI();private void initGUI() try this.setTitle("gzip壓縮與解壓縮");this.setLocation(280,240);AnchorLayout thisLayout = new AnchorLayout();getContentPane().setLayout(thisLayout);setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);jLabel2 = new JLabel();getContentPane().add(jL

33、abel2, new AnchorConstraint(775, 995, 953, 22, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL);jLabel2.setPreferredSize(new java.awt.Dimension(322, 21);jLabel1 = new JLabel();jLabel1.setText(initstate);getContentPane().add(jLabel1,

34、new AnchorConstraint(182, 910, 419, 64, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL);jLabel1.setPreferredSize(new java.awt.Dimension(280, 28);jMenuBar1 = new JMenuBar();setJMenuBar(jMenuBar1);jMenuBar1.setPreferredSize(new java.a

35、wt.Dimension(331, 19);jMenu1 = new JMenu();jMenuBar1.add(jMenu1);jMenu1.setText("文件");jMenuItem1 = new JMenuItem();jMenu1.add(jMenuItem1);jMenuItem1.setText("打開");jMenuItem1.addActionListener(this);jMenuItem3 = new JMenuItem();jMenu1.add(jMenuItem3);jMenuItem3.setText("u8f93

36、u51fau6587u4ef6u5939");jMenuItem3.addActionListener(this);jMenuItem2 = new JMenuItem();jMenu1.add(jMenuItem2);jMenuItem2.setText("退出");jMenuItem2.addActionListener(this);jToggleButton2 = new JToggleButton();getContentPane().add(jToggleButton2, new AnchorConstraint(538, 720, 716, 530,

37、AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL);jToggleButton2.setText("u89e3u538b");jToggleButton2.setPreferredSize(new java.awt.Dimension(63, 21);jToggleButton2.addActionListener(this);jToggleButton1 = new JToggleButton(

38、);getContentPane().add(jToggleButton1, new AnchorConstraint(538, 361, 716, 170, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL);jToggleButton1.setText("u538bu7f29");jToggleButton1.setPreferredSize(new java.awt.Dimension(63

39、, 21);jToggleButton1.addActionListener(this);pack();this.setSize(339, 164); catch (Exception e) e.printStackTrace();/* (非 Javadoc) * see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */public void actionPerformed(ActionEvent arg0) / TODO 自動(dòng)生成方法存根if(arg0.getSource()=jToggl

40、eButton1)String save=""if(dir!=null)save=dir.getAbsolutePath()+"/"+file.getName()+".gzip"elsesave=file.getName()+".gzip"gzip g=new gzip(file.getAbsoluteFile(),save,jLabel2); /System.out.println(dir.getAbsolutePath()+"/"+file.getName();if(arg0.getSour

41、ce()=jToggleButton2)String save=""if(dir!=null)save=dir.getAbsolutePath()+"/"+file.getName().replaceAll("gzip","");elsesave=file.getName().replaceAll("gzip","");if(file.getName().lastIndexOf("gzip")>0) ungzip g=new ungzip(file.

42、getAbsoluteFile(),save); jLabel2.setText("狀態(tài):解壓成功");elsejLabel2.setText("狀態(tài):gzip文件格式不對(duì)");if(arg0.getSource()=jMenuItem1)int state =chooserfile.showOpenDialog(null); file=chooserfile.getSelectedFile(); /System.out.println(file.getName();if(arg0.getSource()=jMenuItem3)chooserDir.se

43、tFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);int state =chooserDir.showOpenDialog(null); dir=chooserDir.getSelectedFile(); /System.out.println(dir.getAbsolutePath();if(arg0.getSource()=jMenuItem2)System.exit(0);if(file!=null)jLabel1.setText("請(qǐng)選擇對(duì): "+file.getName()+" 文件的操作:")

44、;5 軟件系統(tǒng)測(cè)試5.1 運(yùn)行環(huán)境在安裝了JAVA虛擬機(jī)的操作平臺(tái)下即可使用。我用的是在WINDOWS XP上安裝的JAVA虛擬機(jī),版本為jdk1.5.0_06。對(duì)于環(huán)境變量的配置:JAVA_HOME=C:Program FilesJavajdk1.5.0_06CLASSPATH=C:Program FilesJavajdk1.5.0_06libdt.jar;.;PATH=C:Program FilesJavajdk1.5.0_06bin;%JAVA_HOME%bin5.2 測(cè)試方法測(cè)試過(guò)程中,先測(cè)試非法操作程序是否提醒,再對(duì)程序的壓縮與解壓縮是否可逆,也就是是否可以恢復(fù)文件進(jìn)行測(cè)試,另外對(duì)比

45、本程序與現(xiàn)在最流行的壓縮軟件WINRAR的壓縮率。5.3 測(cè)試結(jié)果5.3.1 使用程序?qū)xt文件壓縮對(duì)一個(gè)名為test.txt,大小為42.4KB的文本文檔進(jìn)行壓縮與解壓縮,壓縮生成的文件為test.txt.gzip。執(zhí)行方式和結(jié)果如圖11所示:圖11 程序壓縮演示再將這個(gè)壓縮后的文件解壓縮為testRecover.txt。執(zhí)行方式和結(jié)果如圖12所示:圖12 程序解壓縮演示解壓縮后的文件與原文件大小一致,并且打開對(duì)比也是一致的,這說(shuō)明程序功能上是可以實(shí)現(xiàn)的。計(jì)算其壓縮率大約為43%,而WINRAR的壓縮率也是大約43%。若對(duì)一個(gè)非gzip壓縮格式的文件進(jìn)行解壓縮,則會(huì)得到如圖13的提示:圖13 程序異常演示5.3.2 使用程序?qū)mp圖象文件壓縮對(duì)一個(gè)名為test.bmp,大小為218KB的圖像文件進(jìn)行壓縮與解壓縮,再將這個(gè)壓縮后的文件解壓縮為te

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論