使用JAVA解壓加密的中文ZIP壓縮包

來源:互聯網
上載者:User

標籤:ace   output   color   int   需要   檔案名稱   解壓   class   exception   

近來項目中需要對ZIP壓縮包解壓,然後將解壓後的內容存放到指定的目錄下。

該壓縮包的特性:

  1. 使用標準的zip壓縮格式(壓縮演算法沒有深入探究)
  2. 壓縮包中帶有目錄並且目錄名稱是中文
  3. 壓縮時加了密碼

因為jre中內建的java.util.zip.*包不支援中文及加密壓縮,所以選擇使用zip4j包。

下面是解壓的實現代碼:

 1 public class UnZip { 2     private final int BUFF_SIZE = 4096; 3      4     /* 5     擷取ZIP檔案中的檔案名稱和目錄名 6     */ 7     public void getEntryNames(String zipFilePath, String password){ 8         List<String> entryList = new ArrayList<String>(); 9         ZipFile zf;10         try {11             zf = new ZipFile(zipFilePath);12             zf.setFileNameCharset("gbk");//預設UTF8,如果壓縮包中的檔案名稱是GBK會出現亂碼13             if(zf.isEncrypted()){14                 zf.setPassword(password);//設定壓縮密碼15             }16             for(Object obj : zf.getFileHeaders()){17                 FileHeader fileHeader = (FileHeader)obj;18                 String fileName = fileHeader.getFileName();//檔案名稱會帶上層級目錄資訊19                 entryList.add(fileName);20             }21         } catch (ZipException e) {22             e.printStackTrace();23         }24         return entryList;25     }26 27     /*28     將ZIP包中的檔案解壓到指定目錄29     */30     public void extract(String zipFilePath, String password, String destDir){31         InputStream is = null;32         OutputStream os = null;33         ZipFile zf;34         try {35             zf = new ZipFile(zipFile);36             zf.setFileNameCharset("gbk");37             if(zf.isEncrypted()){38                 zf.setPassword(PASSWORD);39             }40             41             for(Object obj : zf.getFileHeaders()){42                 FileHeader fileHeader = (FileHeader)obj;43                 String destFile = destDir + "/" + fileHeader.getFileName();44                 if(!destFile.getParentFile().exists()){45                     destFile.getParentFile().mkdirs();//建立目錄46                 }47                 is = zf.getInputStream(fileHeader);48                 os = new FileOutputStream(destFile);49                 int readLen = -1;50                 byte[] buff = new byte[BUFF_SIZE];51                 while ((readLen = is.read(buff)) != -1) {52                     os.write(buff, 0, readLen);53                 }54             }55         }catch(Exception e){56             e.printStackTrace();57         }finally{58             //關閉資源59             try{60                 if(is != null){61                     is.close();62                 }63             }catch(IOException ioe){}64             65             try{66                 if(os != null){67                     os.close();68                 }69             }catch(IOException ioe){}70         }71     }72 }

 

以上代碼未經測試,僅作為虛擬碼參考

使用JAVA解壓加密的中文ZIP壓縮包

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.