文件壓縮與解壓縮實踐-JAVA畢業(yè)設(shè)計論文_第1頁
文件壓縮與解壓縮實踐-JAVA畢業(yè)設(shè)計論文_第2頁
文件壓縮與解壓縮實踐-JAVA畢業(yè)設(shè)計論文_第3頁
文件壓縮與解壓縮實踐-JAVA畢業(yè)設(shè)計論文_第4頁
文件壓縮與解壓縮實踐-JAVA畢業(yè)設(shè)計論文_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、學(xué)位論文文件壓縮與解壓縮實踐論文作者姓名: 申請學(xué)位專業(yè):計算機科學(xué)與技術(shù)申請學(xué)位類別: 指導(dǎo)教師姓名(職稱): 論文提交日期: 文件壓縮與解壓縮實踐摘 要隨著人們對數(shù)據(jù)的大量需求以及計算機使用時間的增加,計算機磁盤上的文件越來越大,越來越多。如何讓有限的磁盤空間容納更多的數(shù)據(jù)成為需要解決的問題。一方面,高速發(fā)展的存儲技術(shù)以提高磁盤容量來解決這樣的需求,但隨著網(wǎng)絡(luò)環(huán)境下數(shù)據(jù)傳遞的產(chǎn)生以及帶寬的限制,大容量數(shù)據(jù)問題日益突出。在這兩種需求的推動下,對數(shù)據(jù)壓縮的需求產(chǎn)生了。人們可以將文件在不改變其本身的條件下,將其以更小的占用空間存儲,并且在需要的時候?qū)⑽募謴?fù)成原有的樣子,這就是壓縮目的。本論文主

2、要研究文件的無損壓縮技術(shù),并簡要介紹了文件壓縮的分類、幾種常用的無損壓縮格式和常用的壓縮算法。運用LZ77字典算法、懶惰匹配算法和Huffman編碼算法,使用Java語言在Jbuilder20XX環(huán)境下設(shè)計了使用GZIP算法對文件壓縮與解壓縮的實現(xiàn)程序。用戶可以根據(jù)自己的需求,使用此程序方便地對文件進行壓縮或者解壓縮操作。關(guān)鍵詞:壓縮;解壓縮;GZIP;JavaPractice of File Compression and DecompressionAbstractAs the great demand for data and the using time of computer are

3、increasing, computer files on the disk grow more and more. How to make the limited disk space to store more data has became a problem crying out for solutions. On one hand, the rapid development of storage technology that can increase the disk capacity, can meet such demand. However, with the emerge

4、nce of data transmission in a network environment and the bandwidth limitations, the problem of large-capacity data is increasingly prominent. With the promotion of both demands, the need for data compression and decompression is generated. People can store a file with a smaller storage space withou

5、t changing the files own condition, and can restore the file; that is the purpose of data compression and decompression. This treatise principally research file lossless compression, otherwise, briefly introduced classification of file compression, some general lossless compression format and genera

6、l compression algorithm. A procedure within algorithm called GZIP were designed for file compression and decompression in Java language under the circumstances of Jbuilder20XX,which used LZ77 dictionary algorithm, lazy match algorithm and Huffman coding algorithm. Users could use this procedure comp

7、ress or decompress files expediently according to their demand.Key words: Compression; Decompression; GZIP; Java目 錄論文總頁數(shù):21頁1引言11.1課題背景11.2國內(nèi)外現(xiàn)有的研究成果12壓縮與解壓縮程序分析22.1需求分析22.2使用的算法理論22.2.1LZ77算法簡介22.2.2Huffman算法簡介32.2.3GZIP算法原理分析42.3開發(fā)環(huán)境43總體設(shè)計43.1程序功能模塊53.2模塊分析與流程圖53.2.1壓縮模塊53.2.2解壓縮模塊63.3程序中各個類的初步定義7

8、4詳細設(shè)計和實現(xiàn)84.1壓縮的程序流程84.2解壓縮的程序流程94.3主函數(shù)代碼104.3.1gzip壓縮模塊代碼104.3.2ungzip解壓縮模塊代碼114.4程序界面設(shè)計125軟件系統(tǒng)測試175.1運行環(huán)境175.2測試方法175.3測試結(jié)果175.3.1使用程序?qū)xt文件壓縮175.3.2使用程序?qū)mp圖象文件壓縮185.3.3使用程序?qū)oc文件壓縮18結(jié) 論18參考文獻19致 謝20聲 明211 引言1.1 課題背景隨著科學(xué)技術(shù)的進步,信息技術(shù)越來越廣泛地應(yīng)用到社會的各個行業(yè)和領(lǐng)域,互聯(lián)網(wǎng)深刻地改變著人們的生活方式,推動著人類文明的進步。伴隨著信息技術(shù)的普及和發(fā)展,互聯(lián)網(wǎng)技術(shù)覆

9、蓋了社會政治、經(jīng)濟、文化、生產(chǎn)的各個領(lǐng)域,這種普及日常生活和工作更加的方便、文化娛樂方式更加的多樣化。但是,在信息技術(shù)的飛速發(fā)展下,文件的信息量不斷增加的背景下,文件的存儲和拷貝要求能夠保持?jǐn)?shù)據(jù)的意思不變的情況下縮小容量,這就需要有壓縮與解壓縮來實現(xiàn)這個過程。本論文通過對一種壓縮與解壓縮方法的實踐,對這種算法的實現(xiàn)過程進行研究。1.2 國內(nèi)外現(xiàn)有的研究成果文件壓縮格式現(xiàn)在已有許多種,最流行的有如下幾種:ZIP:我們可以利用WinZip對ZIP文件進行解壓、釋放等操作,還可以用它來處理ARJ、ARC、CAB、LZH等多種不同格式的壓縮文件,從而大大地方便了用戶的操作。RAR:是一種高效快速的文件

10、壓縮格式,但不被大多數(shù)文件壓縮程序支持,WinRAR是在Windows下處理RAR格式文件的最好工具。ARJ:由DOS下曾經(jīng)紅極一時的壓縮軟件ARJ壓縮而成的文件格式,它具有功能強大、壓縮率高等優(yōu)點。到了現(xiàn)在的Windows時代,它已經(jīng)沒有了往日的輝煌。CAB:是Windows 98新增的一種特殊壓縮文件格式,主要用于對有關(guān)軟件安裝盤中的文件進行壓縮,其特點是壓縮率非常高(可能是目前最高的),但一經(jīng)壓縮就不能再進行任何增加、刪除、替換等修改,也就是說它的壓縮包具有“只讀”屬性。我們也可使用WinZip對CAB壓縮包進行操作。UU/UUE:漢字編碼方式,它們原本是Unix系統(tǒng)中使用的一種編碼方式

11、,后來被改寫到DOS中,我們在傳送中文郵件時只須事先使用該方式進行編碼,此后就能順利通過只能處理7位編碼的郵件服務(wù)器,從而解決了漢字的傳輸問題。ACE:一種新式的壓縮程序,壓縮比很高。以上的壓縮格式是可逆的,在解壓縮之后,可以將被壓縮的文件還原成以前未壓縮的文件。另外還有一種不可逆的壓縮格式,如MP3、MPEG、JPG等音頻、視頻、圖像格式的文件都采用了這種壓縮技術(shù),從理論上來說它們也應(yīng)該算壓縮文件,不過它們所采用的壓縮方式與前面講的并不相同,這里簡單地介紹一下:JPEG:JPEG 全名為 Joint Photographic Experts Group,它是一個在國際標(biāo)準(zhǔn)組織(ISO)下從事

12、靜態(tài)影像壓縮標(biāo)準(zhǔn)制定的委員會。它制定出了第一套國標(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 20XX:正式名稱為“ISO 15444”,同樣是由JPEG組織負(fù)責(zé)制定。JPEG 20XX與傳統(tǒng)JPEG最大的不同,在于它放棄了JPEG所采用的以離散余弦轉(zhuǎn)換為主的區(qū)塊編碼方式,而改以小波轉(zhuǎn)換為主的多解析編碼方式。其壓縮率比JPEG高約30%左右,同時支持有損和無損壓縮,無損壓縮對保存一些重要圖片十分有用。MP3:MP3全稱是MPEG 1 Layer 3,

13、是一種高性能的聲音壓縮編碼方案,它可以做出超小“體積”的音樂文件,大小只是原始音頻數(shù)據(jù)的1/10到1/12。但人耳聽起來,效果卻沒有太大差異。MPEG:MPEG是Moving Pictures Experts Group(動態(tài)圖像專家組)的縮寫?,F(xiàn)在使用的有4個版本:MPEG-1、MPEG-2、MPEG-3、MPEG-4。2 壓縮與解壓縮程序分析2.1 需求分析文件的壓縮與解壓縮,要能方便地進行,要完成的功能包括壓縮功能,解壓縮功能,選擇文件路徑,選擇操作方案,選擇新文件保存路徑。此程序還要在壓縮成功后顯示被壓縮文件的大小,并對非法操作給出提示。用戶可以選擇文件進行壓縮或解壓縮操作,并選擇生成

14、保存路徑,默認(rèn)的保存路徑為原文件目錄,壓縮的生成文件以原文件加.gzip后綴命名,在解壓縮操作中,若輸入文件不是gzip格式的壓縮文件,則提示gzip文件格式不對。程序的基本設(shè)計原則有:方便性原則、功能實用性原則和開放性原則等。程序設(shè)計時采用較好的壓縮技術(shù),能保證文件壓縮的壓縮比和可恢復(fù)性,確保程序有較長的生命周期。本程序的總體目標(biāo)是實現(xiàn)文件壓縮與解壓縮的便捷操作,因此需要有便捷的操作界面。2.2 使用的算法理論2.2.1 LZ77算法簡介這一算法是由Jacob Ziv和Abraham Lempel于 1977 年提出,所以命名為LZ77。這種算法模型也被稱為“滑動字典”模型或“滑動窗口”模型

15、。壓縮的模型如圖1:圖1 壓縮中的LZ77算法模型圖在最遠匹配位置和當(dāng)前處理位置之間是可以用來查找匹配的“字典”區(qū)域,隨著壓縮的進行,“字典”區(qū)域從待壓縮文件的頭部不斷地向后滑動,直到達到文件的尾部,短語式壓縮也就結(jié)束了。解壓縮的模型如圖2:圖2 解壓縮中的LZ77算法模型圖2.2.2 Huffman算法簡介David Albert Huffman(哈夫曼/赫夫曼/霍夫曼)在MIT攻讀博士學(xué)位期間于1952年提出了一種從下到上的編碼方法,現(xiàn)在被稱為Huffman編碼,它是一種統(tǒng)計最優(yōu)的變碼長符號編碼,讓最頻繁出現(xiàn)的符號具有最短的編碼。Huffman編碼的過程具體編碼步驟為:(1)將符號按概率從

16、小到大順序從左至右排列葉節(jié)點;(2)連接兩個概率最小的頂層節(jié)點來組成一個父節(jié)點,并在到左右子節(jié)點的兩條連線上分別標(biāo)記0和1;(3)重復(fù)步驟2,直到得到根節(jié)點,形成一棵二叉樹;(4)從根節(jié)點開始到相應(yīng)于每個符號的葉節(jié)點的0/1串,就是該符號的二進制編碼。由于符號按概率大小的排列既可以從左至右、又可以從右至左,而且左右分枝哪個標(biāo)記為0哪個標(biāo)記為1是無關(guān)緊要的,所以最后的編碼結(jié)果可能不唯一,但這僅僅是分配的代碼不同,而代碼的平均長度是相同的。編碼式壓縮利用各個單字節(jié)使用頻率不一樣的傾向,使定長編碼變?yōu)椴欢ㄩL編碼,給使用頻率高的字節(jié)更短的編碼,使用頻率低的字節(jié)更長的編碼,起到壓縮的效果。由于Huffm

17、an編碼為根結(jié)點到葉子結(jié)點路徑上的0和1的序列,而一個葉子結(jié)點的路徑不可能是另一個葉子結(jié)點路徑的前綴,因此一個Huffman編碼不可能為另一個Huffman編碼的前綴,這就保證了Huffman編碼是可以區(qū)分的。由于用Huffman算法建立起來的樹總是一棵最優(yōu)二叉樹,因此這又讓Huffman編碼能夠?qū)嶋H應(yīng)用到壓縮中。2.2.3 GZIP算法原理分析GZIP使用deflate算法進行壓縮。zlib,以及圖形格式png,使用的壓縮算法也是deflate算法。GZIP對于要壓縮的文件,首先使用LZ77算法的一個變種進行壓縮,對得到的結(jié)果再使用Huffman編碼的方法(GZIP根據(jù)情況,選擇使用靜態(tài)Hu

18、ffman編碼或者動態(tài)Huffman編碼)進行壓縮。LZ77算法和Huffman編碼結(jié)合起來,就是deflate算法的根本實現(xiàn)方法,也就是GZIP的壓縮原理。懶惰匹配(lazy match)是GZIP中對LZ77算法的改進,實現(xiàn)過程如下:在壓縮過程中,對于當(dāng)前字節(jié)開始的串,尋找到了最長匹配之后,GZIP并不立即決定使用這個串進行替換。而是看看這個匹配長度是否滿意,如果匹配長度不滿意,而下一個字節(jié)開始的串也有匹配串的話,那么GZIP就找到下一個字節(jié)開始的串的最長匹配,看看是不是比現(xiàn)在這個長。這就是懶惰匹配。如果比現(xiàn)在這個長的話,將不使用現(xiàn)在的這個匹配。如果比現(xiàn)在這個短的話,將確定使用現(xiàn)在的這個匹

19、配。發(fā)現(xiàn)第二次匹配的匹配長度大,就不使用第一次的匹配串。如果直接使用第一次匹配的話,有可能將錯過更長的匹配串。在滿足懶惰匹配的前提條件下,懶惰匹配不限制次數(shù),一次懶惰匹配發(fā)現(xiàn)了更長的匹配串之后,仍會再進行懶惰匹配,如果這次懶匹配,發(fā)現(xiàn)了更長的匹配串,那么上一次的懶匹配找到的匹配串就不用了。進行懶惰匹配是有條件的。進行懶惰匹配必須滿足兩個條件,第一,下一個處理字節(jié)開始的串,要有匹配串,如果下一個處理字節(jié)開始的串沒有匹配串的話,那么就確定使用當(dāng)前的匹配串,不進行懶惰匹配。第二,當(dāng)前匹配串的匹配長度,GZIP不滿意,也就是當(dāng)前匹配長度小于max_lazy_match(max_lazy_match在固

20、定的壓縮級別下,有固定的值)。2.3 開發(fā)環(huán)境使用JBuilder20XX進行程序開發(fā)。JBuilder是一個可視化JAVA開發(fā)工具。它是在Java2平臺上開發(fā)商業(yè)應(yīng)用程序、數(shù)據(jù)庫、發(fā)布程序的優(yōu)秀工具。它支持J2EE,所以程序員可以快速的轉(zhuǎn)換企業(yè)版Java應(yīng)用程序。使用此開發(fā)工具可以實現(xiàn)程序的可視化。3 總體設(shè)計系統(tǒng)總體結(jié)構(gòu)設(shè)計是系統(tǒng)設(shè)計過程中及其重要的一步,對系統(tǒng)的技術(shù)層次,開發(fā)過程,功能實現(xiàn)及開發(fā)成本方面具有重大的影響。系統(tǒng)總統(tǒng)結(jié)構(gòu)設(shè)計應(yīng)盡可能的考慮人機關(guān)系,環(huán)境條件以及算法的可行性等的聯(lián)系,使系統(tǒng)每個部分都能協(xié)調(diào)適應(yīng)。本實驗論證是基于GZIP算法理論體系的,因此使用的壓縮方法是參照GZI

21、P算法的。GZIP算法理論體系主要包含三個內(nèi)容:LZ77算法,Huffman算法,懶惰匹配算法。因此在設(shè)計過程中要注意如何實現(xiàn)這三個算法并且將其結(jié)合起來。3.1 程序功能模塊根據(jù)設(shè)計思路,文件的壓縮和解壓縮是兩個相反的操作,程序可分為GZIP壓縮模塊、UNGZIP壓縮模塊?,F(xiàn)在設(shè)計出功能結(jié)構(gòu)圖如圖3。壓縮與解壓縮程序壓縮程序解壓縮程序圖3 功能結(jié)構(gòu)圖3.2 模塊分析與流程圖分析程序的總體流程圖可以以圖4來表示:NY圖4 總體流程圖3.2.1 壓縮模塊壓縮模塊的實現(xiàn)流程為:(1)打開要壓縮的文件,使用字典算法掃描文件統(tǒng)計文件使用的字符集并統(tǒng)計每個字符集的使用次數(shù)。(2)根據(jù)掃描的結(jié)果構(gòu)建文件字符

22、集的Huffman樹。(3)由文件的Huffman樹求字符集中各字符的編碼,形成Huffman編碼表。(4)建立壓縮文件。(5)將要壓縮文件的字符集大小和文件的大小寫入壓縮文件。將字符集的Huffman樹寫入壓縮文件,供解壓縮時使用。(6)從文件中讀取一個字符集,查Huffman編碼表,得到它的Huffman編碼。按位流放入壓縮文件的寫緩沖區(qū)。(7)檢查壓縮文件的寫緩沖區(qū),如果已滿一個字節(jié),寫入壓縮文件,如果要壓縮的文件沒有達到文件的結(jié)尾,轉(zhuǎn)到步驟6。(8)關(guān)閉要壓縮文件和壓縮文件畫出流程圖如圖5:圖5圖5 壓縮模塊流程圖3.2.2 解壓縮模塊解壓縮模塊的實現(xiàn)流程為:(1)打開壓縮文件,讀取字

23、符集字符個數(shù)和文件的字節(jié)數(shù)。讀入文件的Huffman樹。(2)建立解壓縮文件。(3)讀入一個字節(jié)的編碼,用Huffman樹得到字符,將字符寫入解壓縮文件,如果編碼已用完,就讀取下一個字節(jié),如此重復(fù),直到讀取壓縮文件的全部編碼。(4)關(guān)閉壓縮文件和解壓縮文件。畫出流程圖如圖6:圖6 解壓縮模塊流程圖3.3 程序中各個類的初步定義為了完成此程序,應(yīng)當(dāng)設(shè)計一個接口,十四個類,和二個異常處理類。其中接口:Checksum。類:Adler32;CRC32;CheckedInputStream;CheckedOutputStream;Deflater;DeflaterOutputStream;GZIPIn

24、putStream;GZIPOutputStream;Inflater;InflaterInputStream;ZipEntry;ZipFile;ZipInputStream;ZipOutputStream。異常索引:DataFormatException;ZipException。各個類的簡單介紹如表1:表1:程序各個類的作用條目類型描述Checksum接口被類Adler32和CRC32實現(xiàn)的接口Adler32類使用Alder32算法來計算Checksum數(shù)目CheckedInputStream類一個輸入流,保存著被讀取數(shù)據(jù)的ChecksumCheckedOutputStream類一個輸出流

25、,保存著被讀取數(shù)據(jù)的ChecksumCRC32類使用CRC32算法來計算Checksum數(shù)目Deflater類使用ZLIB壓縮類,支持通常的壓縮方式,程序核心類DeflaterOutputStream類一個輸出過濾流,用來壓縮Deflater格式數(shù)據(jù)GZIPInputStream類一個輸入過濾流,讀取GZIP格式壓縮數(shù)據(jù)GZIPOutputStream類一個輸出過濾流,讀取GZIP格式壓縮數(shù)據(jù)Inflater類使用ZLIB壓縮類,支持通常的解壓方式,程序核心類InflaterInputStream類一個輸入過濾流,用來解壓Inflater格式的壓縮數(shù)據(jù)ZipEntry類存儲ZIP條目ZipFi

26、le類從ZIP文件中讀取ZIP條目ZipInputStream類一個輸入過濾流,用來讀取ZIP格式文件中的文件ZipOutputStream類一個輸出過濾流,用來向ZIP格式文件口寫入文件DataFormatException異常類拋出一個數(shù)據(jù)格式錯誤ZipException異常類拋出一個ZIP文件4 詳細設(shè)計和實現(xiàn)4.1 壓縮的程序流程壓縮程序的實現(xiàn)過程中,涉及到很多類的調(diào)用,除了壓縮有關(guān)的類,還有IO類。對于IO類的調(diào)用不考慮的情況下,各個壓縮功能類的調(diào)用流程(如圖7):(1)主程序gzip調(diào)用輸出過濾流GZIPOutputStream,讀取GZIP格式壓縮數(shù)據(jù),壓縮開始。(2)GZIPO

27、utputStream調(diào)用CRC32來計算Checksum的數(shù)目。(3)在CRC32返回結(jié)果后,GZIPOutputStream調(diào)用Deflater壓縮類來進行壓縮。在Deflater類的調(diào)用過程中,實現(xiàn)了對數(shù)據(jù)的壓縮字符集確定與編碼,也就是實現(xiàn)了LZ77算法、懶惰匹配與Huffman編碼的結(jié)合。(4)建立壓縮文件,調(diào)用DeflaterOutputStream來壓縮Deflater格式數(shù)據(jù)。CRC32GZIPOutputStreamgzipDeflaterDeflaterOutputStreamChecksum圖7 壓縮類的調(diào)用順序圖這些過程的操作是不能離開IO類的,所以實現(xiàn)這些過程的前提是要

28、有數(shù)據(jù)流輸入,也就是調(diào)用FileInputStream,打開需壓縮文件作為文件輸入流;在以上的流程完畢之后,調(diào)用FileOutputStream類建立壓縮文件輸出流,最終形成壓縮后的文件。4.2 解壓縮的程序流程在解壓縮的實現(xiàn)過程中,各個類的調(diào)用關(guān)系(如圖8):(1)主程序ungzip調(diào)用GZIPInputStream,讀取GZIP格式壓縮數(shù)據(jù),解壓縮開始。(2)GZIPInputStream調(diào)用CRC32來計算Checksum的數(shù)目。(3)在CRC32返回結(jié)果后,調(diào)用CheckedInputStream保存被讀取數(shù)據(jù)的Checksum,同時調(diào)用Inflater進行解壓縮。(4)在Inflat

29、er解壓縮過程中,如果數(shù)據(jù)格式錯誤,則調(diào)用DataFormatException;如果沒有數(shù)據(jù)格式錯誤,則調(diào)用InflaterInputStream來解壓Inflater格式的壓縮數(shù)據(jù)。GZIPInputStreamCheckedInputStreamChecksumCRC32ChecksumungzipInflaterInputStreamInflaterDataFormatExceptionZipException圖8 解壓縮類的調(diào)用順序圖4.3 主函數(shù)代碼4.3.1 gzip壓縮模塊代碼壓縮模塊要完成的就是將文件讀入以后進行壓縮,再將壓縮后的數(shù)據(jù)寫入一個新的文件,其部分代碼如下:publ

30、ic 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(args0); /建立壓縮文件輸出流 FileOutputStream fout=new FileOutputStream(args1); /建立gzip壓縮輸出流 GZIPOutputStream gzout=new GZIP

31、OutputStream(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(); catch(IOException e) System.out.println(e); 4.3.2 ungzip解壓縮模塊代碼解壓縮模塊要完成的就是將文件讀入以后進行解壓縮,再將解壓縮后的數(shù)據(jù)寫入一個新的文件,其部

32、分代碼如下: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=new FileInputStream(args0); /建立gzip解壓工作流 GZIPInputStream gzin=new GZIPInputStream(fin); /建立解壓文件輸出流 FileOutputStream fout=

33、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(IOException e) System.out.println(e); 4.4 程序界面設(shè)計為了讓用戶能便捷地進行壓縮與解壓縮的操作,還要對程序加入一個可視化界面。其外觀如圖9:圖9 gzip壓縮與解壓縮程序界面用戶首先選擇需要操作的文件,若

34、要將被操作文件的生成文件保存到原文件所在目錄,可以跳過選擇輸出文件夾操作。如圖10:圖10 gzip壓縮與解壓縮程序選擇文件界面在選擇好文件以后,用戶根據(jù)自己的需要,點擊壓縮或者解壓按鈕,操作便完成。其部分代碼如下:public class gzipJFrame extends javax.swing.JFrame implements ActionListener File file=null;File dir=null;private JToggleButton jToggleButton1;private JMenu jMenu1;private JMenuItem jMenuItem1

35、;private JLabel jLabel2;private JLabel jLabel1;private JMenuItem jMenuItem2;private JMenuBar jMenuBar1;private JToggleButton jToggleButton2;private static final String initstate=請先選擇文件;JFileChooser chooserfile=new JFileChooser();JFileChooser chooserDir=new JFileChooser();private JMenuItem jMenuItem3

36、;/* Auto-generated main method to display this JFrame*/public static void main(String args) gzipJFrame inst = new gzipJFrame();inst.setVisible(true);public gzipJFrame() super();initGUI();private void initGUI() try this.setTitle(gzip壓縮與解壓縮);this.setLocation(280,240);AnchorLayout thisLayout = new Anch

37、orLayout();getContentPane().setLayout(thisLayout);setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);jLabel2 = new JLabel();getContentPane().add(jLabel2, new AnchorConstraint(775, 995, 953, 22, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConst

38、raint.ANCHOR_REL);jLabel2.setPreferredSize(new java.awt.Dimension(322, 21);jLabel1 = new JLabel();jLabel1.setText(initstate);getContentPane().add(jLabel1, new AnchorConstraint(182, 910, 419, 64, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.A

39、NCHOR_REL);jLabel1.setPreferredSize(new java.awt.Dimension(280, 28);jMenuBar1 = new JMenuBar();setJMenuBar(jMenuBar1);jMenuBar1.setPreferredSize(new java.awt.Dimension(331, 19);jMenu1 = new JMenu();jMenuBar1.add(jMenu1);jMenu1.setText(文件);jMenuItem1 = new JMenuItem();jMenu1.add(jMenuItem1);jMenuItem

40、1.setText(打開);jMenuItem1.addActionListener(this);jMenuItem3 = new JMenuItem();jMenu1.add(jMenuItem3);jMenuItem3.setText(u8f93u51fau6587u4ef6u5939);jMenuItem3.addActionListener(this);jMenuItem2 = new JMenuItem();jMenu1.add(jMenuItem2);jMenuItem2.setText(退出);jMenuItem2.addActionListener(this);jToggleB

41、utton2 = new JToggleButton();getContentPane().add(jToggleButton2, new AnchorConstraint(538, 720XX716, 530, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL);jToggleButton2.setText(u89e3u538b);jToggleButton2.setPreferredSize(new java.a

42、wt.Dimension(63, 21);jToggleButton2.addActionListener(this);jToggleButton1 = new JToggleButton();getContentPane().add(jToggleButton1, new AnchorConstraint(538, 361, 716, 170, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL);jToggleBu

43、tton1.setText(u538bu7f29);jToggleButton1.setPreferredSize(new java.awt.Dimension(63, 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) */publ

44、ic void actionPerformed(ActionEvent arg0) / TODO 自動生成方法存根if(arg0.getSource()=jToggleButton1)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

45、.getName();if(arg0.getSource()=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.getAbsoluteFile(),save); jLabel2.setText(狀態(tài):解壓成功);elsejLabel2

46、.setText(狀態(tài):gzip文件格式不對);if(arg0.getSource()=jMenuItem1)int state =chooserfile.showOpenDialog(null); file=chooserfile.getSelectedFile(); /System.out.println(file.getName();if(arg0.getSource()=jMenuItem3)chooserDir.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);int state =chooserDir.showOpenDialo

47、g(null); dir=chooserDir.getSelectedFile(); /System.out.println(dir.getAbsolutePath();if(arg0.getSource()=jMenuItem2)System.exit(0);if(file!=null)jLabel1.setText(請選擇對: +file.getName()+ 文件的操作:);5 軟件系統(tǒng)測試5.1 運行環(huán)境在安裝了JAVA虛擬機的操作平臺下即可使用。我用的是在WINDOWS XP上安裝的JAVA虛擬機,版本為jdk1.5.0_06。對于環(huán)境變量的配置:JAVA_HOME=C:Progra

48、m FilesJavajdk1.5.0_06CLASSPATH=C:Program FilesJavajdk1.5.0_06libdt.jar;.;PATH=C:Program FilesJavajdk1.5.0_06bin;%JAVA_HOME%bin5.2 測試方法測試過程中,先測試非法操作程序是否提醒,再對程序的壓縮與解壓縮是否可逆,也就是是否可以恢復(fù)文件進行測試,另外對比本程序與現(xiàn)在最流行的壓縮軟件WINRAR的壓縮率。5.3 測試結(jié)果5.3.1 使用程序?qū)xt文件壓縮對一個名為test.txt,大小為42.4KB的文本文檔進行壓縮與解壓縮,壓縮生成的文件為test.txt.gzip。執(zhí)行方式和結(jié)果如圖11所示:圖11 程序壓縮演示再將這個壓縮后的文件解壓縮為testRecover.txt。執(zhí)行方式和結(jié)果如圖12所示:圖12 程序解壓縮演示解壓縮后的文件與原文件大小一致,并且打開對比也是一致的,這說明程序功能上是可以實現(xiàn)的。計算其壓縮率大約為43%,而WINRAR的壓縮率也是大約43%。若對一個非gzip壓縮格式的文件進行解壓縮,則會得到如圖13的提示:圖13 程序異常演示5.3.2 使用程序?qū)?/p>

溫馨提示

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

評論

0/150

提交評論