最近公司準備讓各項目組提供公共工具組件,手中正好無事便研究其中一個工具 - 文件壓縮與解壓縮工具。 java
目前JAVA API已提供對於ZIP文件的壓縮與解壓縮,但網上總結不支持ZIP文件加密與解密甚至對於中文支持也有問題,因而果斷找其餘的支持加密解密的第三方包。 winzipaes 與 ZIP4J 都符合項目的要求 ,最終選擇ZIP4J來進行使用。 算法
ZIP4J 項目地址爲 :http://www.lingala.net/zip4j/ ,但該地址沒法直接訪問須要使用代理進行訪問 ide
再提供一個在線代理網站:http://www.7daili.com/ 工具
目前ZIP4J 版本爲:1.3.1 ,只須要直接下一載一個zip4j_1.3.1.jar一個jar包便可,同時能夠下載官網提供的例子進行學習,例子至關詳細(官網提供的例子的jdk 爲1.4的版本 導入後須要修改一下) 學習
官網提供的例子程序比較簡單與小巧 整個程序也就一百多k,但demo程序對於各類功能的使用講的很是詳細。 測試
項目包結構分爲三層: 網站
示例代碼: 加密
示例代碼中須要對文件進行操做,爲方便程序運行建立如下三個文件 能夠直接運行大多數代碼 spa
示例1 建立壓縮包添 加文件到壓縮包中(未設置加密) .net
public class AddFilesDeflateComp { public AddFilesDeflateComp() { try { ZipFile zipFile = new ZipFile("c:\\ZipTest\\AddFilesDeflateComp.zip"); ArrayList<File> filesToAdd = new ArrayList<File>(); filesToAdd.add(new File("c:\\ZipTest\\sample.txt")); filesToAdd.add(new File("c:\\ZipTest\\myvideo.avi")); filesToAdd.add(new File("c:\\ZipTest\\mysong.mp3")); ZipParameters parameters = new ZipParameters(); parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); // set compression method to deflate compression parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); zipFile.addFiles(filesToAdd, parameters); } catch (ZipException e) { e.printStackTrace(); } } /** * @param args */ public static void main(String[] args) { new AddFilesDeflateComp(); } }
示例2 建立壓縮包添加文件到 指定目錄中進行壓縮
public class AddFilesToFolderInZip { public AddFilesToFolderInZip() { try { ZipFile zipFile = new ZipFile("c:\\ZipTest\\AddFilesDeflateComp.zip"); ArrayList<File> filesToAdd = new ArrayList<File>(); filesToAdd.add(new File("c:\\ZipTest\\sample.txt")); filesToAdd.add(new File("c:\\ZipTest\\myvideo.avi")); filesToAdd.add(new File("c:\\ZipTest\\mysong.mp3")); ZipParameters parameters = new ZipParameters(); parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); parameters.setRootFolderInZip("test2/"); zipFile.addFiles(filesToAdd, parameters); } catch (ZipException e) { e.printStackTrace(); } } /** * @param args */ public static void main(String[] args) { new AddFilesToFolderInZip(); } }
示例3 添加文件夾到壓縮包中
public class AddFolder { public AddFolder() { try { ZipFile zipFile = new ZipFile("c:\\ZipTest\\AddFolder.zip"); String folderToAdd = "c:\\FolderToAdd"; ZipParameters parameters = new ZipParameters(); parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); zipFile.addFolder(folderToAdd, parameters); } catch (ZipException e) { e.printStackTrace(); } } public static void main(String[] args) { new AddFolder(); } }
示例4 建立加密壓縮包
public class AddFilesWithAESEncryption { public AddFilesWithAESEncryption() { try { ZipFile zipFile = new ZipFile("c:\\ZipTest\\AddFilesWithAESZipEncryption.zip"); ArrayList<File> filesToAdd = new ArrayList<File>(); filesToAdd.add(new File("c:\\ZipTest\\sample.txt")); filesToAdd.add(new File("c:\\ZipTest\\myvideo.avi")); filesToAdd.add(new File("c:\\ZipTest\\mysong.mp3")); ZipParameters parameters = new ZipParameters(); parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); parameters.setEncryptFiles(true); parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES); parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256); parameters.setPassword("123"); zipFile.addFiles(filesToAdd, parameters); } catch (ZipException e) { e.printStackTrace(); } } public static void main(String[] args) { new AddFilesWithAESEncryption(); } }
加密壓縮包後打開時須要輸入密碼,與rar相同:
示例5 建立分卷壓縮包
public class CreateSplitZipFile { public CreateSplitZipFile() { try { ZipFile zipFile = new ZipFile("c:\\ZipTest\\CreateSplitZipFile.zip"); ArrayList<File> filesToAdd = new ArrayList<File>(); filesToAdd.add(new File("c:\\ZipTest\\sample.txt")); filesToAdd.add(new File("c:\\ZipTest\\myvideo.avi")); filesToAdd.add(new File("c:\\ZipTest\\mysong.mp3")); ZipParameters parameters = new ZipParameters(); parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); zipFile.createZipFile(filesToAdd, parameters, true, 65536); } catch (ZipException e) { e.printStackTrace(); } } /** * @param args */ public static void main(String[] args) { new CreateSplitZipFile(); } }
示例6 經過流的方式添加文件到壓縮包中
public class AddStreamToZip { public AddStreamToZip() { InputStream is = null; try { ZipFile zipFile = new ZipFile("c:\\ZipTest\\AddStreamToZip.zip"); ZipParameters parameters = new ZipParameters(); parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); parameters.setFileNameInZip("yourfilename.txt"); parameters.setSourceExternalStream(true); is = new FileInputStream("c:\\ZipTest\\sample.txt"); zipFile.addStream(is, parameters); } catch (Exception e) { e.printStackTrace(); } finally { if (is != null) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } } public static void main(String[] args) { new AddStreamToZip(); } }
示例7 解壓壓縮文件
public class ExtractAllFiles { public ExtractAllFiles() { try { ZipFile zipFile = new ZipFile("c:\\ZipTest\\ProgressInformation.zip"); zipFile.extractAll("c:\\ZipTest1"); } catch (ZipException e) { e.printStackTrace(); } } /** * @param args */ public static void main(String[] args) { new ExtractAllFiles(); } }
if (zipFile.isEncrypted()) { // if yes, then set the password for the zip file zipFile.setPassword("test123!"); }
壓縮效率
ZIP4J提供5中壓縮算法:
根據API提供的幾種不一樣壓縮級別進行測試(文件夾壓縮),測試結果以下:
一個180M的文件夾壓縮後
與WinRAR 相比較來講,壓縮時間仍是很不錯 但對文件的壓縮大小來講仍是WINRAR要強一些 (各人電腦配置不一樣 壓縮的時間這些也不一樣)
以上即是ZIP4J提供的一些經常使用的工具方法,總結在此,方便本身與你們使用。若是有更好的工具或者有不正確的地方歡迎你們指出!