版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、成都信息工程學院學位論文文件壓縮與解壓縮實踐論文作者姓名:袁淵申請學位專業(yè):計算機科學與技術申請學位類別:工學學士指導教師姓名(職稱):葉安勝(講師)論文提交日期:2007年 6月10日文件壓縮與解壓縮實踐摘 要隨著人們對數(shù)據(jù)的大量需求以及計算機使用時間的增加,計算機磁盤上的文件越來越大,越來越多。如何讓有限的磁盤空間容納更多的數(shù)據(jù)成為需要解決的問題。一方面,高速發(fā)展的存儲技術以提高磁盤容量來解決這樣的需求,但隨著網(wǎng)絡環(huán)境下數(shù)據(jù)傳遞的產(chǎn)生以及帶寬的限制,大容量數(shù)據(jù)問題日益突出。在這兩種需求的推動下,對數(shù)據(jù)壓縮的需求產(chǎn)生了。人們可以將文件在不改變其本身的條件下,將其以更小的占用空間存儲,并且在需
2、要的時候將文件恢復成原有的樣子,這就是壓縮目的。本論文主要研究文件的無損壓縮技術,并簡要介紹了文件壓縮的分類、幾種常用的無損壓縮格式和常用的壓縮算法。運用LZ77字典算法、懶惰匹配算法和Huffman編碼算法,使用Java語言在Jbuilder2006環(huán)境下設計了使用GZIP算法對文件壓縮與解壓縮的實現(xiàn)程序。用戶可以根據(jù)自己的需求,使用此程序方便地對文件進行壓縮或者解壓縮操作。關鍵詞:壓縮;解壓縮;GZIP;Java目 錄論文總頁數(shù):21頁1引言11.1課題背景11.2國內(nèi)外現(xiàn)有的研究成果12壓縮與解壓縮程序分析22.1需求分析22.2使用的算法理論22.2.1LZ77算法簡介22.2.2Hu
3、ffman算法簡介32.2.3GZIP算法原理分析42.3開發(fā)環(huán)境43總體設計43.1程序功能模塊53.2模塊分析與流程圖53.2.1壓縮模塊53.2.2解壓縮模塊63.3程序中各個類的初步定義74詳細設計和實現(xiàn)84.1壓縮的程序流程84.2解壓縮的程序流程94.3主函數(shù)代碼104.3.1gzip壓縮模塊代碼104.3.2ungzip解壓縮模塊代碼114.4程序界面設計125軟件系統(tǒng)測試175.1運行環(huán)境175.2測試方法175.3測試結果175.3.1使用程序對txt文件壓縮175.3.2使用程序對bmp圖象文件壓縮185.3.3使用程序對doc文件壓縮18結 論18參考文獻19致 謝20聲
4、 明211 引言1.1 課題背景隨著科學技術的進步,信息技術越來越廣泛地應用到社會的各個行業(yè)和領域,互聯(lián)網(wǎng)深刻地改變著人們的生活方式,推動著人類文明的進步。伴隨著信息技術的普及和發(fā)展,互聯(lián)網(wǎng)技術覆蓋了社會政治、經(jīng)濟、文化、生產(chǎn)的各個領域,這種普及日常生活和工作更加的方便、文化娛樂方式更加的多樣化。但是,在信息技術的飛速發(fā)展下,文件的信息量不斷增加的背景下,文件的存儲和拷貝要求能夠保持數(shù)據(jù)的意思不變的情況下縮小容量,這就需要有壓縮與解壓縮來實現(xiàn)這個過程。本論文通過對一種壓縮與解壓縮方法的實踐,對這種算法的實現(xiàn)過程進行研究。1.2 國內(nèi)外現(xiàn)有的研究成果文件壓縮格式現(xiàn)在已有許多種,最流行的有如下幾種
5、:ZIP:我們可以利用WinZip對ZIP文件進行解壓、釋放等操作,還可以用它來處理ARJ、ARC、CAB、LZH等多種不同格式的壓縮文件,從而大大地方便了用戶的操作。RAR:是一種高效快速的文件壓縮格式,但不被大多數(shù)文件壓縮程序支持,WinRAR是在Windows下處理RAR格式文件的最好工具。ARJ:由DOS下曾經(jīng)紅極一時的壓縮軟件ARJ壓縮而成的文件格式,它具有功能強大、壓縮率高等優(yōu)點。到了現(xiàn)在的Windows時代,它已經(jīng)沒有了往日的輝煌。CAB:是Windows 98新增的一種特殊壓縮文件格式,主要用于對有關軟件安裝盤中的文件進行壓縮,其特點是壓縮率非常高(可能是目前最高的),但一經(jīng)壓
6、縮就不能再進行任何增加、刪除、替換等修改,也就是說它的壓縮包具有“只讀”屬性。我們也可使用WinZip對CAB壓縮包進行操作。UU/UUE:漢字編碼方式,它們原本是Unix系統(tǒng)中使用的一種編碼方式,后來被改寫到DOS中,我們在傳送中文郵件時只須事先使用該方式進行編碼,此后就能順利通過只能處理7位編碼的郵件服務器,從而解決了漢字的傳輸問題。ACE:一種新式的壓縮程序,壓縮比很高。以上的壓縮格式是可逆的,在解壓縮之后,可以將被壓縮的文件還原成以前未壓縮的文件。另外還有一種不可逆的壓縮格式,如MP3、MPEG、JPG等音頻、視頻、圖像格式的文件都采用了這種壓縮技術,從理論上來說它們也應該算壓縮文件,
7、不過它們所采用的壓縮方式與前面講的并不相同,這里簡單地介紹一下:JPEG:JPEG 全名為 Joint Photographic Experts Group,它是一個在國際標準組織(ISO)下從事靜態(tài)影像壓縮標準制定的委員會。它制定出了第一套國標靜態(tài)影像壓縮標準:ISO 10918-1 就是我們俗稱的JPEG了。由于JPEG優(yōu)良的品質(zhì),使得它在短短的幾年內(nèi)就獲得極大的成功,目前網(wǎng)站上80%的影像都是采用JPEG的壓縮標準。JPEG 2000:正式名稱為“ISO 15444”,同樣是由JPEG組織負責制定。JPEG 2000與傳統(tǒng)JPEG最大的不同,在于它放棄了JPEG所采用的以離散余弦轉換為主
8、的區(qū)塊編碼方式,而改以小波轉換為主的多解析編碼方式。其壓縮率比JPEG高約30%左右,同時支持有損和無損壓縮,無損壓縮對保存一些重要圖片十分有用。MP3:MP3全稱是MPEG 1 Layer 3,是一種高性能的聲音壓縮編碼方案,它可以做出超小“體積”的音樂文件,大小只是原始音頻數(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 需求分析文件的壓縮與解壓縮,要能方便地進行,要完
9、成的功能包括壓縮功能,解壓縮功能,選擇文件路徑,選擇操作方案,選擇新文件保存路徑。此程序還要在壓縮成功后顯示被壓縮文件的大小,并對非法操作給出提示。用戶可以選擇文件進行壓縮或解壓縮操作,并選擇生成保存路徑,默認的保存路徑為原文件目錄,壓縮的生成文件以原文件加.gzip后綴命名,在解壓縮操作中,若輸入文件不是gzip格式的壓縮文件,則提示gzip文件格式不對。程序的基本設計原則有:方便性原則、功能實用性原則和開放性原則等。程序設計時采用較好的壓縮技術,能保證文件壓縮的壓縮比和可恢復性,確保程序有較長的生命周期。本程序的總體目標是實現(xiàn)文件壓縮與解壓縮的便捷操作,因此需要有便捷的操作界面。2.2 使
10、用的算法理論2.2.1 LZ77算法簡介這一算法是由Jacob Ziv和Abraham Lempel于 1977 年提出,所以命名為LZ77。這種算法模型也被稱為“滑動字典”模型或“滑動窗口”模型。壓縮的模型如圖1:圖1 壓縮中的LZ77算法模型圖在最遠匹配位置和當前處理位置之間是可以用來查找匹配的“字典”區(qū)域,隨著壓縮的進行,“字典”區(qū)域從待壓縮文件的頭部不斷地向后滑動,直到達到文件的尾部,短語式壓縮也就結束了。解壓縮的模型如圖2:圖2 解壓縮中的LZ77算法模型圖2.2.2 Huffman算法簡介David Albert Huffman(哈夫曼/赫夫曼/霍夫曼)在MIT攻讀博士學位期間于1
11、952年提出了一種從下到上的編碼方法,現(xiàn)在被稱為Huffman編碼,它是一種統(tǒng)計最優(yōu)的變碼長符號編碼,讓最頻繁出現(xiàn)的符號具有最短的編碼。Huffman編碼的過程具體編碼步驟為:(1)將符號按概率從小到大順序從左至右排列葉節(jié)點;(2)連接兩個概率最小的頂層節(jié)點來組成一個父節(jié)點,并在到左右子節(jié)點的兩條連線上分別標記0和1;(3)重復步驟2,直到得到根節(jié)點,形成一棵二叉樹;(4)從根節(jié)點開始到相應于每個符號的葉節(jié)點的0/1串,就是該符號的二進制編碼。由于符號按概率大小的排列既可以從左至右、又可以從右至左,而且左右分枝哪個標記為0哪個標記為1是無關緊要的,所以最后的編碼結果可能不唯一,但這僅僅是分配的
12、代碼不同,而代碼的平均長度是相同的。編碼式壓縮利用各個單字節(jié)使用頻率不一樣的傾向,使定長編碼變?yōu)椴欢ㄩL編碼,給使用頻率高的字節(jié)更短的編碼,使用頻率低的字節(jié)更長的編碼,起到壓縮的效果。由于Huffman編碼為根結點到葉子結點路徑上的0和1的序列,而一個葉子結點的路徑不可能是另一個葉子結點路徑的前綴,因此一個Huffman編碼不可能為另一個Huffman編碼的前綴,這就保證了Huffman編碼是可以區(qū)分的。由于用Huffman算法建立起來的樹總是一棵最優(yōu)二叉樹,因此這又讓Huffman編碼能夠實際應用到壓縮中。2.2.3 GZIP算法原理分析GZIP使用deflate算法進行壓縮。zlib,以及圖
13、形格式png,使用的壓縮算法也是deflate算法。GZIP對于要壓縮的文件,首先使用LZ77算法的一個變種進行壓縮,對得到的結果再使用Huffman編碼的方法(GZIP根據(jù)情況,選擇使用靜態(tài)Huffman編碼或者動態(tài)Huffman編碼)進行壓縮。LZ77算法和Huffman編碼結合起來,就是deflate算法的根本實現(xiàn)方法,也就是GZIP的壓縮原理。懶惰匹配(lazy match)是GZIP中對LZ77算法的改進,實現(xiàn)過程如下:在壓縮過程中,對于當前字節(jié)開始的串,尋找到了最長匹配之后,GZIP并不立即決定使用這個串進行替換。而是看看這個匹配長度是否滿意,如果匹配長度不滿意,而下一個字節(jié)開始的
14、串也有匹配串的話,那么GZIP就找到下一個字節(jié)開始的串的最長匹配,看看是不是比現(xiàn)在這個長。這就是懶惰匹配。如果比現(xiàn)在這個長的話,將不使用現(xiàn)在的這個匹配。如果比現(xiàn)在這個短的話,將確定使用現(xiàn)在的這個匹配。發(fā)現(xiàn)第二次匹配的匹配長度大,就不使用第一次的匹配串。如果直接使用第一次匹配的話,有可能將錯過更長的匹配串。在滿足懶惰匹配的前提條件下,懶惰匹配不限制次數(shù),一次懶惰匹配發(fā)現(xiàn)了更長的匹配串之后,仍會再進行懶惰匹配,如果這次懶匹配,發(fā)現(xiàn)了更長的匹配串,那么上一次的懶匹配找到的匹配串就不用了。進行懶惰匹配是有條件的。進行懶惰匹配必須滿足兩個條件,第一,下一個處理字節(jié)開始的串,要有匹配串,如果下一個處理字節(jié)
15、開始的串沒有匹配串的話,那么就確定使用當前的匹配串,不進行懶惰匹配。第二,當前匹配串的匹配長度,GZIP不滿意,也就是當前匹配長度小于max_lazy_match(max_lazy_match在固定的壓縮級別下,有固定的值)。2.3 開發(fā)環(huán)境使用JBuilder2006進行程序開發(fā)。JBuilder是一個可視化JAVA開發(fā)工具。它是在Java2平臺上開發(fā)商業(yè)應用程序、數(shù)據(jù)庫、發(fā)布程序的優(yōu)秀工具。它支持J2EE,所以程序員可以快速的轉換企業(yè)版Java應用程序。使用此開發(fā)工具可以實現(xiàn)程序的可視化。3 總體設計系統(tǒng)總體結構設計是系統(tǒng)設計過程中及其重要的一步,對系統(tǒng)的技術層次,開發(fā)過程,功能實現(xiàn)及開發(fā)
16、成本方面具有重大的影響。系統(tǒng)總統(tǒng)結構設計應盡可能的考慮人機關系,環(huán)境條件以及算法的可行性等的聯(lián)系,使系統(tǒng)每個部分都能協(xié)調(diào)適應。本實驗論證是基于GZIP算法理論體系的,因此使用的壓縮方法是參照GZIP算法的。GZIP算法理論體系主要包含三個內(nèi)容:LZ77算法,Huffman算法,懶惰匹配算法。因此在設計過程中要注意如何實現(xiàn)這三個算法并且將其結合起來。3.1 程序功能模塊根據(jù)設計思路,文件的壓縮和解壓縮是兩個相反的操作,程序可分為GZIP壓縮模塊、UNGZIP壓縮模塊?,F(xiàn)在設計出功能結構圖如圖3。壓縮與解壓縮程序壓縮程序解壓縮程序圖3 功能結構圖3.2 模塊分析與流程圖分析程序的總體流程圖可以以圖
17、4來表示:NY圖4 總體流程圖3.2.1 壓縮模塊壓縮模塊的實現(xiàn)流程為:(1)打開要壓縮的文件,使用字典算法掃描文件統(tǒng)計文件使用的字符集并統(tǒng)計每個字符集的使用次數(shù)。(2)根據(jù)掃描的結果構建文件字符集的Huffman樹。(3)由文件的Huffman樹求字符集中各字符的編碼,形成Huffman編碼表。(4)建立壓縮文件。(5)將要壓縮文件的字符集大小和文件的大小寫入壓縮文件。將字符集的Huffman樹寫入壓縮文件,供解壓縮時使用。(6)從文件中讀取一個字符集,查Huffman編碼表,得到它的Huffman編碼。按位流放入壓縮文件的寫緩沖區(qū)。(7)檢查壓縮文件的寫緩沖區(qū),如果已滿一個字節(jié),寫入壓縮文
18、件,如果要壓縮的文件沒有達到文件的結尾,轉到步驟6。(8)關閉要壓縮文件和壓縮文件畫出流程圖如圖5:圖5圖5 壓縮模塊流程圖3.2.2 解壓縮模塊解壓縮模塊的實現(xiàn)流程為:(1)打開壓縮文件,讀取字符集字符個數(shù)和文件的字節(jié)數(shù)。讀入文件的Huffman樹。(2)建立解壓縮文件。(3)讀入一個字節(jié)的編碼,用Huffman樹得到字符,將字符寫入解壓縮文件,如果編碼已用完,就讀取下一個字節(jié),如此重復,直到讀取壓縮文件的全部編碼。(4)關閉壓縮文件和解壓縮文件。畫出流程圖如圖6:圖6 解壓縮模塊流程圖3.3 程序中各個類的初步定義為了完成此程序,應當設計一個接口,十四個類,和二個異常處理類。其中接口:Ch
19、ecksum。類:Adler32;CRC32;CheckedInputStream;CheckedOutputStream;Deflater;DeflaterOutputStream;GZIPInputStream;GZIPOutputStream;Inflater;InflaterInputStream;ZipEntry;ZipFile;ZipInputStream;ZipOutputStream。異常索引:DataFormatException;ZipException。各個類的簡單介紹如表1:表1:程序各個類的作用條目類型描述Checksum接口被類Adler32和CRC32實現(xiàn)的接口A
20、dler32類使用Alder32算法來計算Checksum數(shù)目CheckedInputStream類一個輸入流,保存著被讀取數(shù)據(jù)的ChecksumCheckedOutputStream類一個輸出流,保存著被讀取數(shù)據(jù)的ChecksumCRC32類使用CRC32算法來計算Checksum數(shù)目Deflater類使用ZLIB壓縮類,支持通常的壓縮方式,程序核心類DeflaterOutputStream類一個輸出過濾流,用來壓縮Deflater格式數(shù)據(jù)GZIPInputStream類一個輸入過濾流,讀取GZIP格式壓縮數(shù)據(jù)GZIPOutputStream類一個輸出過濾流,讀取GZIP格式壓縮數(shù)據(jù)Infl
21、ater類使用ZLIB壓縮類,支持通常的解壓方式,程序核心類InflaterInputStream類一個輸入過濾流,用來解壓Inflater格式的壓縮數(shù)據(jù)ZipEntry類存儲ZIP條目ZipFile類從ZIP文件中讀取ZIP條目ZipInputStream類一個輸入過濾流,用來讀取ZIP格式文件中的文件ZipOutputStream類一個輸出過濾流,用來向ZIP格式文件口寫入文件DataFormatException異常類拋出一個數(shù)據(jù)格式錯誤ZipException異常類拋出一個ZIP文件4 詳細設計和實現(xiàn)4.1 壓縮的程序流程壓縮程序的實現(xiàn)過程中,涉及到很多類的調(diào)用,除了壓縮有關的類,還有
22、IO類。對于IO類的調(diào)用不考慮的情況下,各個壓縮功能類的調(diào)用流程(如圖7):(1)主程序gzip調(diào)用輸出過濾流GZIPOutputStream,讀取GZIP格式壓縮數(shù)據(jù),壓縮開始。(2)GZIPOutputStream調(diào)用CRC32來計算Checksum的數(shù)目。(3)在CRC32返回結果后,GZIPOutputStream調(diào)用Deflater壓縮類來進行壓縮。在Deflater類的調(diào)用過程中,實現(xiàn)了對數(shù)據(jù)的壓縮字符集確定與編碼,也就是實現(xiàn)了LZ77算法、懶惰匹配與Huffman編碼的結合。(4)建立壓縮文件,調(diào)用DeflaterOutputStream來壓縮Deflater格式數(shù)據(jù)。CRC32
23、GZIPOutputStreamgzipDeflaterDeflaterOutputStreamChecksum圖7 壓縮類的調(diào)用順序圖這些過程的操作是不能離開IO類的,所以實現(xiàn)這些過程的前提是要有數(shù)據(jù)流輸入,也就是調(diào)用FileInputStream,打開需壓縮文件作為文件輸入流;在以上的流程完畢之后,調(diào)用FileOutputStream類建立壓縮文件輸出流,最終形成壓縮后的文件。4.2 解壓縮的程序流程在解壓縮的實現(xiàn)過程中,各個類的調(diào)用關系(如圖8):(1)主程序ungzip調(diào)用GZIPInputStream,讀取GZIP格式壓縮數(shù)據(jù),解壓縮開始。(2)GZIPInputStream調(diào)用CR
24、C32來計算Checksum的數(shù)目。(3)在CRC32返回結果后,調(diào)用CheckedInputStream保存被讀取數(shù)據(jù)的Checksum,同時調(diào)用Inflater進行解壓縮。(4)在Inflater解壓縮過程中,如果數(shù)據(jù)格式錯誤,則調(diào)用DataFormatException;如果沒有數(shù)據(jù)格式錯誤,則調(diào)用InflaterInputStream來解壓Inflater格式的壓縮數(shù)據(jù)。GZIPInputStreamCheckedInputStreamChecksumCRC32ChecksumungzipInflaterInputStreamInflaterDataFormatExceptionZip
25、Exception圖8 解壓縮類的調(diào)用順序圖4.3 主函數(shù)代碼4.3.1 gzip壓縮模塊代碼壓縮模塊要完成的就是將文件讀入以后進行壓縮,再將壓縮后的數(shù)據(jù)寫入一個新的文件,其部分代碼如下: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;/設定讀入緩沖區(qū)尺寸 int num; while (num=fin.read(buf) != -1) gzout.write(buf,0,num); gzout.close();/關閉流,必須關閉所有輸入輸出流.保證輸入輸出完整和釋放系統(tǒng)資源. fout.close(); fin.close(
27、); catch(IOException e) System.out.println(e); 4.3.2 ungzip解壓縮模塊代碼解壓縮模塊要完成的就是將文件讀入以后進行解壓縮,再將解壓縮后的數(shù)據(jù)寫入一個新的文件,其部分代碼如下: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 程序界面設計為了讓用戶能便捷地進行壓縮與解壓縮的操作,還要對程序加入一個可視化界面。其外觀如圖9:圖9 gzip壓縮與解壓縮程序界面用戶首先選擇需要操作的文件,若要將被操作文件的生成文件保存到原文件所在目錄,可以跳過選擇輸出文件夾操作。如圖10:圖10 gzip壓縮與解壓縮程序選擇文件界面在選擇好文件以后,用戶根據(jù)自己的需要,點擊壓縮或者解壓按鈕,操作便完成。其部分代碼如下: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、"請先選擇文件"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 自動生成方法存根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文件格式不對");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("請選擇對: "+file.getName()+" 文件的操作:")
44、;5 軟件系統(tǒng)測試5.1 運行環(huán)境在安裝了JAVA虛擬機的操作平臺下即可使用。我用的是在WINDOWS XP上安裝的JAVA虛擬機,版本為jdk1.5.0_06。對于環(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 測試方法測試過程中,先測試非法操作程序是否提醒,再對程序的壓縮與解壓縮是否可逆,也就是是否可以恢復文件進行測試,另外對比
45、本程序與現(xiàn)在最流行的壓縮軟件WINRAR的壓縮率。5.3 測試結果5.3.1 使用程序對txt文件壓縮對一個名為test.txt,大小為42.4KB的文本文檔進行壓縮與解壓縮,壓縮生成的文件為test.txt.gzip。執(zhí)行方式和結果如圖11所示:圖11 程序壓縮演示再將這個壓縮后的文件解壓縮為testRecover.txt。執(zhí)行方式和結果如圖12所示:圖12 程序解壓縮演示解壓縮后的文件與原文件大小一致,并且打開對比也是一致的,這說明程序功能上是可以實現(xiàn)的。計算其壓縮率大約為43%,而WINRAR的壓縮率也是大約43%。若對一個非gzip壓縮格式的文件進行解壓縮,則會得到如圖13的提示:圖13 程序異常演示5.3.2 使用程序對bmp圖象文件壓縮對一個名為test.bmp,大小為218KB的圖像文件進行壓縮與解壓縮,再將這個壓縮后的文件解壓縮為te
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 水果店服務員工作總結
- 機床行業(yè)前臺工作心得體會
- 2021年內(nèi)蒙古自治區(qū)呼倫貝爾市公開招聘警務輔助人員輔警筆試自考題2卷含答案
- 2024年浙江省紹興市公開招聘警務輔助人員輔警筆試自考題1卷含答案
- 《群眾路線教育活動》課件
- 黑龍江綏化市(2024年-2025年小學六年級語文)統(tǒng)編版質(zhì)量測試((上下)學期)試卷及答案
- 2024年聚三嗪項目資金申請報告代可行性研究報告
- 2025年泵及液體提升機項目規(guī)劃申請報告模稿
- 2025年拖拉機及農(nóng)林牧漁用掛車項目立項申請報告模式
- 廣東省湛江市(2024年-2025年小學六年級語文)部編版摸底考試(下學期)試卷及答案
- 2025版路燈維護保養(yǎng)及應急搶修服務合同示例3篇
- 2025初級會計職稱《初級會計實務》全真模擬試及答案解析(3套)
- 2025年1月山西、陜西、寧夏、青海普通高等學校招生考試適應性測試(八省聯(lián)考)歷史試題 含解析
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應用實踐指導材料之6:“4組織環(huán)境-4.4創(chuàng)新管理體系”(雷澤佳編制-2025B0)
- 2024-2030年撰寫:中國汽車半軸行業(yè)發(fā)展趨勢及競爭調(diào)研分析報告
- 北疆文化全媒體傳播體系的構建與實踐
- 2025屆福建省廈門市重點中學高三第二次聯(lián)考語文試卷含解析
- OpenCV計算機視覺基礎教程(Python版)教學教案
- 2024年度二人合伙光伏發(fā)電項目投資合同3篇
- 《涉江采芙蓉》 課件高中語文統(tǒng)編版必修上冊
- 管道護理小組工作總結
評論
0/150
提交評論