ZIP文件压缩与解压缩

ZIP4J解压优点

  1. ZIP4J 是一个支持处理ZIP文件的开源库
  2. 支持创建,修改,添加,删除,解压 压缩文件
  3. 支持读/写密码保护
  4. 支持AES加密 128/256
  5. 支持标准ZIP加密
  6. 支持进度监视器
  7. 自持Unicode 文件名
  8. 支持创建分卷压缩文件
  9. 支持将文件添加到压缩包中但不进行压缩

ZIP4J 项目地址为 :http://www.lingala.net/zip4j/.
ZIP文件压缩与解压缩_第1张图片

项目包结构分为三层:

  1. ZIP:该包下主要讲述压缩包的新增,修改,删除等例子(包含加密文件创建,通过流的方式创建 、添加压缩文件 、创建分卷压缩文件);
  2. MISC:该包下主要展示几个工具方法例子,如:是否是分卷压缩包的判断、获取压缩包中的文件信息(文件名 大小等信息)、压缩进度查看、根据文件名删除压缩包对应文件等;
  3. EXTRACT:该包下例子都是关于解压压缩包的例子,包括解压加密文件等;

示例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相同:

示例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文件压缩与解压缩学习
    ZIP文件压缩与解压缩_第2张图片
  • 如果已经存在同名压缩包,则会抛出异常提示已经存在: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();
    }

}
  • 在进行解压缩时需要判断文件是否为加密压缩,否则会抛出异常:ZipException: empty or null password provided for AES Decryptor

具体参考:https://www.open-open.com/lib/view/open1378556210553.html.

你可能感兴趣的:(ZIP文件压缩与解压缩)