最近公司準備讓各項目組提供公共工具元件,手中正好無事便研究其中一個工具 - 檔案壓縮與解壓縮工具。
目前java api已提供對于zip檔案的壓縮與解壓縮,但網上總結不支援zip檔案加密與解密甚至對于中文支援也有問題,于是果斷找其他的支援加密解密的第三方包。 winzipaes 與 zip4j 都符合項目的要求 ,最終選擇zip4j來進行使用。
zip4j 是一個支援處理zip檔案的開源庫
支援建立,修改,添加,删除,解壓 壓縮檔案
支援讀/寫密碼保護
支援aes加密 128/256
支援标準zip加密
支援進度螢幕
自持unicode 檔案名
支援建立分卷壓縮檔案
支援将檔案添加到壓縮包中但不進行壓縮
zip4j 項目位址為 :http://www.lingala.net/zip4j/ ,但該位址無法直接通路需要使用代理進行通路
再提供一個線上代理網站:http://www.7daili.com/
目前zip4j 版本為:1.3.1 ,隻需要直接下一載一個zip4j_1.3.1.jar一個jar包即可,同時可以下載下傳官網提供的例子進行學習,例子相當詳細(官網提供的例子的jdk 為1.4的版本 導入後需要修改一下)
官網提供的例子程式比較簡單與小巧 整個程式也就一百多k,但demo程式對于各種功能的使用講的非常詳細。
項目包結構分為三層:
zip:該包下主要講述壓縮包的新增,修改,删除等例子(包含加密檔案建立,通過流的方式建立 、添加壓縮檔案 、建立分卷壓縮檔案);
misc:該包下主要展示幾個工具方法例子,如:是否是分卷壓縮包的判斷、擷取壓縮包中的檔案資訊(檔案名 大小等資訊)、壓縮進度檢視、根據檔案名删除壓縮包對應檔案等;
extract:該包下例子都是關于解壓壓縮包的例子,包括解壓加密檔案等;
示例代碼:
示例代碼中需要對檔案進行操作,為友善程式運作建立以下三個檔案 可以直接運作大多數代碼
sample.txt
myvideo.avi
mysong.mp3
示例1 建立壓縮包添 加檔案到壓縮包中(未設定加密)
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<code>public</code>
<code>class</code>
<code>addfilesdeflatecomp {</code>
<code> </code>
<code> </code>
<code>addfilesdeflatecomp() {</code>
<code> </code>
<code>try</code>
<code>{</code>
<code> </code>
<code> </code>
<code>zipfile zipfile =</code>
<code>new</code>
<code>zipfile(</code>
<code>"c:\\ziptest\\addfilesdeflatecomp.zip"</code>
<code>);</code>
<code>arraylist<file> filestoadd =</code>
<code>arraylist<file>();</code>
<code>filestoadd.add(</code>
<code>file(</code>
<code>"c:\\ziptest\\sample.txt"</code>
<code>));</code>
<code>"c:\\ziptest\\myvideo.avi"</code>
<code>"c:\\ziptest\\mysong.mp3"</code>
<code>zipparameters parameters =</code>
<code>zipparameters();</code>
<code>parameters.setcompressionmethod(zip4jconstants.comp_deflate);</code>
<code>// set compression method to deflate compression</code>
<code>parameters.setcompressionlevel(zip4jconstants.deflate_level_normal); </code>
<code>zipfile.addfiles(filestoadd, parameters);</code>
<code>}</code>
<code>catch</code>
<code>(zipexception e) {</code>
<code>e.printstacktrace();</code>
<code>} </code>
<code>/**</code>
<code> </code>
<code>* @param args</code>
<code>*/</code>
<code>static</code>
<code>void</code>
<code>main(string[] args) {</code>
<code>addfilesdeflatecomp();</code>
<code> </code>
該類主要用于建立普通壓縮包。如果壓縮包不存在 則會自動建立一個zip包;如果已經存在一個不為空的同名zip壓縮包 會将内容添加到該同名壓縮包中。
如果手動建立一個格式為zip的空壓縮包進行儲存,則為抛出異常:zipexception :negative seek offset
如果将其他的檔案字尾修改為zip包再運作程式,也會抛出異常:zipexception: zip headers not found. probably not a zip file
zip4j 提供zipparameters對象來進行壓縮參數設定,其中setcompressionmethod方法可以設定壓縮還是 不壓縮
示例2 建立壓縮包添加檔案到 指定目錄中進行壓縮
31
32
33
<code>addfilestofolderinzip {</code>
<code>addfilestofolderinzip() {</code>
<code>parameters.setcompressionlevel(zip4jconstants.deflate_level_normal);</code>
<code>parameters.setrootfolderinzip(</code>
<code>"test2/"</code>
<code>} </code>
<code> </code>
<code>addfilestofolderinzip();</code>
該程式執行後,會将sample.txt、myvideo.avi、mysong.mp3 添加到test2檔案夾中 并生成addfilesdeflatecomp.zip 壓縮包
如果已經存在addfilesdeflatecomp.zip,則會将需要打包的内容添加到已經存在的壓縮包去
示例3 添加檔案夾到壓縮包中
<code>addfolder {</code>
<code>addfolder() {</code>
<code>"c:\\ziptest\\addfolder.zip"</code>
<code>string foldertoadd =</code>
<code>"c:\\foldertoadd"</code>
<code>;</code>
<code>zipfile.addfolder(foldertoadd, parameters);</code>
<code>addfolder();</code>
需要添加的檔案夾必須存在,否則抛出異常:zipexception: input folder does not exist
* 如果已經存在同名檔案則會出現一個檔案的時候會出現一個問題,程式會生成一個臨時包并去修改之前存在的同名壓縮檔案,最後修改不成功且會抛出異常:zipexception: cannot rename modified zip file最後隻留下一個臨時包, 建議在生成的時候添加判斷 避免出現這種錯誤
示例4 建立加密壓縮包
34
35
<code>addfileswithaesencryption {</code>
<code>addfileswithaesencryption() {</code>
<code>"c:\\ziptest\\addfileswithaeszipencryption.zip"</code>
<code>parameters.setencryptfiles(</code>
<code>true</code>
<code>parameters.setencryptionmethod(zip4jconstants.enc_method_aes);</code>
<code>parameters.setaeskeystrength(zip4jconstants.aes_strength_256);</code>
<code>parameters.setpassword(</code>
<code>"123"</code>
<code>addfileswithaesencryption();</code>
加密壓縮包後打開時需要輸入密碼,與rar相同:
示例5 建立分卷壓縮包
<code>createsplitzipfile {</code>
<code>createsplitzipfile() {</code>
<code>"c:\\ziptest\\createsplitzipfile.zip"</code>
<code>zipfile.createzipfile(filestoadd, parameters,</code>
<code>,</code>
<code>65536</code>
<code>createsplitzipfile();</code>
執行程式後會根據設定大小生成多個 壓縮包名.z + 數量編号檔案,如下圖:
如果已經存在同名壓縮包,則會抛出異常提示已經存在:zipexception: zip file: c:\ziptest\createsplitzipfile.zip already exists. to add files to existing zip file use addfile method
需要進行分卷壓縮的大小,不能小于規定的65536 bytes
示例6 通過流的方式添加檔案到壓縮包中
36
37
<code>addstreamtozip {</code>
<code>addstreamtozip() {</code>
<code>inputstream is =</code>
<code>null</code>
<code>"c:\\ziptest\\addstreamtozip.zip"</code>
<code>parameters.setfilenameinzip(</code>
<code>"yourfilename.txt"</code>
<code>parameters.setsourceexternalstream(</code>
<code>is =</code>
<code>fileinputstream(</code>
<code>zipfile.addstream(is, parameters);</code>
<code>(exception e) {</code>
<code>finally</code>
<code>if</code>
<code>(is !=</code>
<code>) {</code>
<code> </code>
<code> </code>
<code>is.close();</code>
<code>(ioexception e) {</code>
<code>addstreamtozip();</code>
示例7 解壓壓縮檔案
<code>extractallfiles {</code>
<code>extractallfiles() {</code>
<code>"c:\\ziptest\\progressinformation.zip"</code>
<code>zipfile.extractall(</code>
<code>"c:\\ziptest1"</code>
<code>extractallfiles();</code>
如果解壓的檔案需要密碼,可以添加以下代碼:
<code>(zipfile.isencrypted()) {</code>
<code>// if yes, then set the password for the zip file</code>
<code>zipfile.setpassword(</code>
<code>"test123!"</code>
在進行解壓縮時需要判斷檔案是否為加密壓縮,否則會抛出異常:zipexception: empty or null password provided for aes decryptor
壓縮效率
zip4j提供5中壓縮算法:
deflate_level_fastest
deflate_level_fastest
deflate_level_normal
deflate_level_maximum
deflate_level_ultra
根據api提供的幾種不同壓縮級别進行測試(檔案夾壓縮),測試結果如下:
一個180m的檔案夾壓縮後
winrar 30秒 - 78.7 mb ;
normal - 18 秒 91.2 mb ;
fast 13秒 -93.1 mb;
fastest - 最快速10 秒94.7 mb
maximum 23 秒 - 90.7 mb;
ultra -50 90.6 mb
與winrar 相比較來說,壓縮時間還是很不錯 但對檔案的壓縮大小來說還是winrar要強一些 (各人電腦組態不同 壓縮的時間這些也不同)
以上便是zip4j提供的一些常用的工具方法,總結在此,友善自己與大家使用。如果有更好的工具或者有不正确的地方歡迎大家指出!