天天看點

java解壓縮/壓縮/加密壓縮/加密解壓縮 ZIP4J---ZIP檔案壓縮與解壓縮學習

最近公司準備讓各項目組提供公共工具元件,手中正好無事便研究其中一個工具 - 檔案壓縮與解壓縮工具。

          目前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的版本 導入後需要修改一下)

java解壓縮/壓縮/加密壓縮/加密解壓縮 ZIP4J---ZIP檔案壓縮與解壓縮學習

官網提供的例子程式比較簡單與小巧 整個程式也就一百多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>public</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>            </code><code>arraylist&lt;file&gt; filestoadd =</code><code>new</code> <code>arraylist&lt;file&gt;();</code>

<code>            </code><code>filestoadd.add(</code><code>new</code>

<code>file(</code><code>"c:\\ziptest\\sample.txt"</code><code>));</code>

<code>file(</code><code>"c:\\ziptest\\myvideo.avi"</code><code>));</code>

<code>file(</code><code>"c:\\ziptest\\mysong.mp3"</code><code>));</code>

<code>            </code><code>zipparameters parameters =</code><code>new</code> <code>zipparameters();</code>

<code>            </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>            </code><code>zipfile.addfiles(filestoadd, parameters);</code>

<code>        </code><code>}</code><code>catch</code> <code>(zipexception e) {</code>

<code>            </code><code>e.printstacktrace();</code>

<code>        </code><code>}   </code>

<code>    </code><code>}</code>

<code>    </code><code>/**</code>

<code>     </code><code>* @param args</code>

<code>     </code><code>*/</code>

<code>static</code> <code>void</code> <code>main(string[] args) {</code>

<code>        </code><code>new</code>

<code>addfilesdeflatecomp();</code>

<code> </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>public</code> <code>class</code> <code>addfilestofolderinzip {</code>

<code>addfilestofolderinzip() {</code>

<code>            </code><code>parameters.setcompressionmethod(zip4jconstants.comp_deflate);</code>

<code>            </code><code>parameters.setcompressionlevel(zip4jconstants.deflate_level_normal);</code>

<code>            </code><code>parameters.setrootfolderinzip(</code><code>"test2/"</code><code>);</code>

<code>        </code><code>} </code>

<code>         </code> 

<code>addfilestofolderinzip();</code>

該程式執行後,會将sample.txt、myvideo.avi、mysong.mp3 添加到test2檔案夾中

并生成addfilesdeflatecomp.zip 壓縮包

如果已經存在addfilesdeflatecomp.zip,則會将需要打包的内容添加到已經存在的壓縮包去

示例3 添加檔案夾到壓縮包中

<code>public</code> <code>class</code> <code>addfolder {</code>

<code>addfolder() {</code>

<code>            </code><code>zipfile zipfile =</code><code>new</code> <code>zipfile(</code><code>"c:\\ziptest\\addfolder.zip"</code><code>);</code>

<code>            </code><code>string foldertoadd =</code><code>"c:\\foldertoadd"</code><code>;</code>

<code>            </code><code>zipfile.addfolder(foldertoadd, parameters);</code>

<code>        </code><code>}</code>

<code>addfolder();</code>

需要添加的檔案夾必須存在,否則抛出異常:zipexception: input folder does not exist

* 如果已經存在同名檔案則會出現一個檔案的時候會出現一個問題,程式會生成一個臨時包并去修改之前存在的同名壓縮檔案,最後修改不成功且會抛出異常:zipexception: cannot rename modified zip file最後隻留下一個臨時包,

建議在生成的時候添加判斷 避免出現這種錯誤

示例4 建立加密壓縮包

34

35

<code>public</code> <code>class</code> <code>addfileswithaesencryption {</code>

<code>addfileswithaesencryption() {</code>

<code>            </code><code>zipfile zipfile =</code><code>new</code> <code>zipfile(</code><code>"c:\\ziptest\\addfileswithaeszipencryption.zip"</code><code>);</code>

<code>            </code><code>parameters.setcompressionlevel(zip4jconstants.deflate_level_normal); </code>

<code>            </code><code>parameters.setencryptfiles(</code><code>true</code><code>);</code>

<code>            </code><code>parameters.setencryptionmethod(zip4jconstants.enc_method_aes);</code>

<code>            </code><code>parameters.setaeskeystrength(zip4jconstants.aes_strength_256);</code>

<code>            </code><code>parameters.setpassword(</code><code>"123"</code><code>);</code>

<code>addfileswithaesencryption();</code>

加密壓縮包後打開時需要輸入密碼,與rar相同:

java解壓縮/壓縮/加密壓縮/加密解壓縮 ZIP4J---ZIP檔案壓縮與解壓縮學習

示例5 建立分卷壓縮包

<code>public</code> <code>class</code> <code>createsplitzipfile {</code>

<code>createsplitzipfile() {</code>

<code>            </code><code>zipfile zipfile =</code><code>new</code> <code>zipfile(</code><code>"c:\\ziptest\\createsplitzipfile.zip"</code><code>);</code>

<code>            </code><code>zipfile.createzipfile(filestoadd, parameters,</code><code>true</code><code>,</code><code>65536</code><code>);</code>

<code>createsplitzipfile();</code>

執行程式後會根據設定大小生成多個  壓縮包名.z + 數量編号檔案,如下圖:

java解壓縮/壓縮/加密壓縮/加密解壓縮 ZIP4J---ZIP檔案壓縮與解壓縮學習

如果已經存在同名壓縮包,則會抛出異常提示已經存在: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>public</code> <code>class</code> <code>addstreamtozip {</code>

<code>addstreamtozip() {</code>

<code>        </code><code>inputstream is =</code><code>null</code><code>;</code>

<code>            </code><code>zipfile zipfile =</code><code>new</code> <code>zipfile(</code><code>"c:\\ziptest\\addstreamtozip.zip"</code><code>);</code>

<code>            </code><code>parameters.setfilenameinzip(</code><code>"yourfilename.txt"</code><code>);</code>

<code>            </code><code>parameters.setsourceexternalstream(</code><code>true</code><code>);</code>

<code>            </code><code>is =</code><code>new</code> <code>fileinputstream(</code><code>"c:\\ziptest\\sample.txt"</code><code>);</code>

<code>            </code><code>zipfile.addstream(is, parameters);</code>

<code>        </code><code>}</code><code>catch</code> <code>(exception e) {</code>

<code>        </code><code>}</code><code>finally</code> <code>{</code>

<code>            </code><code>if</code>

<code>(is !=</code><code>null</code><code>) {</code>

<code>                </code><code>try</code>

<code>                    </code><code>is.close();</code>

<code>                </code><code>}</code><code>catch</code> <code>(ioexception e) {</code>

<code>                    </code><code>e.printstacktrace();</code>

<code>                </code><code>}</code>

<code>            </code><code>}</code>

<code>addstreamtozip();</code>

示例7 解壓壓縮檔案

<code>public</code> <code>class</code> <code>extractallfiles {</code>

<code>extractallfiles() {</code>

<code>            </code><code>zipfile zipfile =</code><code>new</code> <code>zipfile(</code><code>"c:\\ziptest\\progressinformation.zip"</code><code>);</code>

<code>            </code><code>zipfile.extractall(</code><code>"c:\\ziptest1"</code><code>);</code>

<code>extractallfiles();</code>

如果解壓的檔案需要密碼,可以添加以下代碼:

<code>if</code> <code>(zipfile.isencrypted()) {</code>

<code>                </code><code>// if yes, then set the password for the zip file</code>                <code>zipfile.setpassword(</code><code>"test123!"</code><code>);</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提供的一些常用的工具方法,總結在此,友善自己與大家使用。如果有更好的工具或者有不正确的地方歡迎大家指出!