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

相关推荐
毕设源码-朱学姐3 分钟前
【开题答辩全过程】以 基于JAVA的市级非物质文化遗产交流平台为例,包含答辩的问题和答案
java·开发语言
小学鸡!29 分钟前
Spring Boot通过手机号获取归属地
java·spring boot
pedestrian_h1 小时前
操作系统-线程
android·java·开发语言
whltaoin2 小时前
【JAVA全栈项目】弧图图-智能图床 SpringBoot+Vue3 :[框架开荒:一文全步骤打通前后端项目全流程]
java·spring boot·vue·开源项目·全栈·cos
Fu1co2 小时前
【Spring Boot】Spring Boot解决循环依赖
java·spring boot·spring
我命由我123453 小时前
Derby - Derby 服务器(Derby 概述、Derby 服务器下载与启动、Derby 连接数据库与创建数据表、Derby 数据库操作)
java·运维·服务器·数据库·后端·java-ee·后端框架
技术砖家--Felix3 小时前
Spring Boot入门篇:快速搭建你的第一个Spring Boot应用
java·开发语言·音视频
i源4 小时前
Java语言处理Js文件内容格式化
java·javascript
为什么要做囚徒5 小时前
IntelliJ IDEA 远程断点调试完全指南
java·ide·intellij-idea