ZIP4J---ZIP文件壓縮與解壓縮學習

jopen 11年前發布 | 71K 次閱讀 ZIP4J Java開發

          目前JAVA API已提供對于ZIP文件的壓縮與解壓縮,但網上總結不支持ZIP文件加密與解密甚至對于中文支持也有問題,于是果斷找其他的支持加密解密的第三方包。 winzipaes 與 ZIP4J 都符合項目的要求 ,最終選擇ZIP4J來進行使用。

  • ZIP4J 是一個支持處理ZIP文件的開源庫
  • 支持創建,修改,添加,刪除,解壓 壓縮文件
  • 支持讀/寫密碼保護
  • 支持AES加密 128/256
  • 支持標準ZIP加密
  • 支持進度監視器
  • 自持Unicode 文件名
  • 支持創建分卷壓縮文件
  • 支持將文件添加到壓縮包中但不進行壓縮


ZIP4J 項目地址為  :http://www.lingala.net/zip4j/ ,但該地址無法直接訪問需要使用代理進行訪問

目前ZIP4J 版本為:1.3.1 ,只需要直接下一載一個zip4j_1.3.1.jar一個jar包即可,同時可以下載官網提供的例子進行學習,例子相當詳細(官網提供的例子的jdk 為1.4的版本 導入后需要修改一下)

ZIP4J---ZIP文件壓縮與解壓縮學習


官網提供的例子程序比較簡單與小巧 整個程序也就一百多k,但demo程序對于各種功能的使用講的非常詳細。

項目包結構分為三層:

  • ZIP:該包下主要講述壓縮包的新增,修改,刪除等例子(包含加密文件創建,通過流的方式創建 、添加壓縮文件 、創建分卷壓縮文件);
  • MISC:該包下主要展示幾個工具方法例子,如:是否是分卷壓縮包的判斷、獲取壓縮包中的文件信息(文件名 大小等信息)、壓縮進度查看、根據文件名刪除壓縮包對應文件等;
  • EXTRACT:該包下例子都是關于解壓壓縮包的例子,包括解壓加密文件等;


示例代碼

示例代碼中需要對文件進行操作,為方便程序運行創建以下三個文件 可以直接運行大多數代碼

  1. sample.txt
  2. myvideo.avi
  3. mysong.mp3


示例1 創建壓縮包添 加文件到壓縮包中(未設置加密)

public class AddFilesDeflateComp {

    public AddFilesDeflateComp() {
        try {

            ZipFile zipFile = new ZipFile("c:\\ZipTest\\AddFilesDeflateComp.zip");

            ArrayList filesToAdd = new ArrayList();
            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();
    }

}
  • 該類主要用于創建普通壓縮包。如果壓縮包不存在 則會自動創建一個ZIP包;如果已經存在一個不為空的同名ZIP壓縮包 會將內容添加到該同名壓縮包中。
  • 如果手動創建一個格式為ZIP的空壓縮包進行保存,則為拋出異常:ZipException :Negative seek offset
  • 如果將其他的文件后綴修改為ZIP包再運行程序,也會拋出異常:ZipException: zip headers not found. probably not a zip file
  • ZIP4J 提供ZipParameters對象來進行壓縮參數設置,其中setCompressionMethod方法可以設置壓縮還是 不壓縮


示例2 創建壓縮包添加文件到 文件夾中進行壓縮

public class AddFilesToFolderInZip {

    public AddFilesToFolderInZip() {
        try {
            ZipFile zipFile = new ZipFile("c:\\ZipTest\\AddFilesDeflateComp.zip");
            ArrayList filesToAdd = new ArrayList();
            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();
    }

}


  • 該程序執行后,會將sample.txt、myvideo.avi、mysong.mp3 添加到test2文件夾中 并生成AddFilesDeflateComp.zip 壓縮包
  • 如果已經存在AddFilesDeflateComp.zip,則會將需要打包的內容添加到已經存在的壓縮包去


示例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();
    }

}
  • 需要添加的文件夾必須存在,否則拋出異常:ZipException: input folder does not exist


示例4 創建加密壓縮包

public class AddFilesWithAESEncryption {

    public AddFilesWithAESEncryption() {

        try {
            ZipFile zipFile = new ZipFile("c:\\ZipTest\\AddFilesWithAESZipEncryption.zip");

            ArrayList filesToAdd = new ArrayList();
            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相同:

ZIP4J---ZIP文件壓縮與解壓縮學習


示例5 創建分卷壓縮包

public class CreateSplitZipFile {

    public CreateSplitZipFile() {

        try {

            ZipFile zipFile = new ZipFile("c:\\ZipTest\\CreateSplitZipFile.zip");


            ArrayList filesToAdd = new ArrayList();
            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();
    }

}
  • 執行程序后會根據設置大小生成多個  壓縮包名.z + 數量編號文件,如下圖:ZIP4J---ZIP文件壓縮與解壓縮學習

  • 如果已經存在同名壓縮包,則會拋出異常提示已經存在:ZipException: zip file: c:\ZipTest\CreateSplitZipFile.zip already exists. To add files to existing zip file use addFile method
  • 需要進行分卷壓縮的大小,不能小于規定的65536 bytes


示例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!");
                }

  • 在進行解壓縮時需要判斷文件是否為加密壓縮,否則會拋出異常:ZipException: empty or null password provided for AES Decryptor


 以上便是ZIP4J提供的一些常用的工具方法,總結在此,方便自己與大家使用。如果有更好的工具或者有不正確的地方歡迎大家指出!


 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!