zip4j压缩使用总结

一、引入依赖

java 复制代码
	<dependency>
		<groupId>net.lingala.zip4j</groupId>
		<artifactId>zip4j</artifactId>
		<version>1.3.1</version>
	</dependency>

二、使用添加文件(addFiles)的方式生成压缩包

java 复制代码
    /**
     * @Author wangtw
     * @Description 使用addFiles方式压缩文件
     * @Date 07:34 2023/11/22
     * @param fileList 需要压缩的文件列表
     * @param zipPath zip包路径
     * @param password zip包密码
     * @return
     **/
    public static void zip(ArrayList<File> fileList, String zipPath, String password) {
        ZipParameters parameters = new ZipParameters();
        // 压缩方式
        parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
        // 压缩级别
        parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
        if (StringUtils.hasText(password)) {
            parameters.setEncryptFiles(true);
            // 加密方式
            parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
            parameters.setPassword(password.toCharArray());
        }
        try {
            ZipFile zipFile = new ZipFile(zipPath);
            zipFile.addFiles(fileList, parameters);
        } catch (ZipException e) {
            e.printStackTrace();
        }
    }

三、使用添加流(addStream)的方式生成压缩文件

java 复制代码
    /**
     * @Author wangtw
     * @Description 使用addStream方式压缩文件
     * @Date 20:01 2023/11/22
     * @param fileList 文件列比啊
     * @param zipPath zip包路径
     * @param password 密码
     * @return
     **/
    public static void zipByInputStream(ArrayList<File> fileList, String zipPath, String password) throws ZipException, FileNotFoundException {
        ZipFile zipFile = new ZipFile(zipPath);
        for (File file : fileList) {
            InputStream inputStream = new FileInputStream(file);

            ZipParameters parameters = new ZipParameters();
            // 压缩方式
            parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
            // 压缩级别
            parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
            if (StringUtils.hasText(password)) {
                parameters.setEncryptFiles(true);
                // 加密方式
                parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
                parameters.setPassword(password.toCharArray());
            }
            parameters.setSourceExternalStream(true);
            parameters.setFileNameInZip(file.getName());

            zipFile.addStream(inputStream, parameters);

            // 关闭输入流
            IOUtils.closeQuietly(inputStream);
        }
    }

四、向压缩包输出流(ZipOutputStream)中写入文件

1、示例代码

java 复制代码
    /**
     * 压缩文件到输出流中
     * @param fileList 文件列表
     * @param outputStream 压缩包输出流
     * @param password 压缩包密码
     * @throws IOException
     * @throws ZipException
     */
    public static void zipOutputStream(ArrayList<File> fileList, OutputStream outputStream, String password) throws IOException, ZipException {
        ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);

        for (File file : fileList) {
            ZipParameters parameters = new ZipParameters();
            // 压缩方式
            parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
            // 压缩级别
            parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
            if (StringUtils.hasText(password)) {
                parameters.setEncryptFiles(true);
                // 加密方式
                parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
                parameters.setPassword(password.toCharArray());
            }
            parameters.setSourceExternalStream(true);
            parameters.setFileNameInZip(file.getName());

            zipOutputStream.putNextEntry(null, parameters);

            InputStream inputStream = new FileInputStream(file);
            byte[] bytes=new byte[1024 * 1024];
            int len;
            while((len = inputStream.read(bytes)) != -1){
                zipOutputStream.write(bytes,0, len);
            }

            IOUtils.closeQuietly(inputStream);

            zipOutputStream.closeEntry();
        }
        zipOutputStream.finish();
    }

2、测试代码

java 复制代码
    @Test
    public void zipOutputStreamTest() {
        File fileone = new File("/Users/outenmon/workspace/idea_workspace/java/cento-practice/src/main/resources/io-test/test.txt");
        File filetwo = new File("/Users/outenmon/workspace/idea_workspace/java/cento-practice/src/main/resources/application.yaml");
        ArrayList<File> fileList = new ArrayList<>();
        fileList.add(fileone);
        fileList.add(filetwo);

        OutputStream outputStream = null;
        try {
            outputStream = new FileOutputStream(new File(new Date().getTime() + ".zip"));
            zipOutputStream(fileList, outputStream, "123456");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (ZipException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeQuietly(outputStream);
        }
    }

五、异常总结

1、net.lingala.zip4j.exception.ZipException: input file is null

需要把ZipParameters 对象的isSourceExternalStream 属性设置为true,例如:parameters.setSourceExternalStream(true);

2、net.lingala.zip4j.exception.ZipException: file name is empty for external stream

需要设置ZipParameters 对象的fileNameInZip 属性,例如:parameters.setFileNameInZip(file.getName());

代码地址:
https://gitee.com/wangtianwen1996/cento-practice/blob/master/src/test/java/com/xiaobai/Zip4jTest.java

相关推荐
CoderYanger4 小时前
Java EE 进阶:8.MyBatis 操作数据库(入门)(第二弹)
java·数据库·spring boot·spring·面试·java-ee·mybatis
CQU_JIAKE6 小时前
11.7[高体】
java·后端·spring
apcipot_rain7 小时前
C++转Java日记(04)
java·开发语言·c++
特立独行的猫A8 小时前
我给女儿写了个打字练习:一边敲键盘,一边把小学英语单词记牢
java·后端·python
憧憬成为java架构高手的小白9 小时前
LangGraph4j 实战(下)
java
天诰10 小时前
SA-K-11 检索会消失吗与四个未解问题
java·服务器·人工智能·python·机器学习·ai编程
这个昵称不容易13 小时前
SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在
java·springboot·毕设
计算机毕设定制辅导-无忧学长14 小时前
《基于微信小程序的居家医疗陪护预约系统设计与实现》
java·spring boot·微信小程序·uniapp·居家医疗陪护预约系统
文丑颜不良啊15 小时前
LeetCode2221~2240题目解析
java·leetcode
秋饼15 小时前
Computer Use Agent Java 落地实战:感知-行动循环、执行器与安全围栏生产级实现
java·ai·技术分享·后端开发