压缩解压文件工具

一、maven依赖

<dependency>
            <groupId>net.lingala.zip4j</groupId>
            <artifactId>zip4j</artifactId>
            <version>2.11.5</version>
        </dependency>

二、工具类

package com.summer.toolkit.util;

import com.summer.toolkit.exception.BizException;
import lombok.extern.slf4j.Slf4j;
import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.model.AbstractFileHeader;
import net.lingala.zip4j.model.FileHeader;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.model.enums.EncryptionMethod;
import org.apache.commons.lang3.StringUtils;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * @author author
 * @date 2024/7/4 18:32
 */

@Slf4j
public class ZipUtils {

    /**
     * 压缩单个文件
     * 或者向已有Zip文件中添加文件
     * 文件可以分开添加,即向同一个压缩包中添加一个文件1,解压密码也为1,再添加一个文件2,解压密码为2,再添加一个文件3,没有解压密码
     *
     * @param fileName    要压缩的文件名
     * @param zipFileName 生成的压缩文件名
     * @throws BizException 压缩文件时发生异常
     */
    public static void compressFile(String fileName, String zipFileName) {
        ZipUtils.compressFile(fileName, zipFileName, null);
    }

    /**
     * 压缩单个文件
     * 或者向已有Zip文件中添加文件
     *
     * @param fileName       要压缩的文件名
     * @param zipFileName    生成的压缩文件名
     * @param passwordString 压缩文件的密码
     * @throws BizException 压缩文件时发生异常
     */
    public static void compressFile(String fileName, String zipFileName, String passwordString) {
        // 密码不为空则加密文件
        ZipParameters zipParameters = StringUtils.isNotBlank(passwordString)
                ? ZipUtils.getZipParameters(true)
                : ZipUtils.getZipParameters(false);
        char[] password = StringUtils.isNotBlank(passwordString)
                ? passwordString.toCharArray()
                : null;

        try (ZipFile zipFile = new ZipFile(zipFileName, password)) {
            zipFile.addFile(new File(fileName), zipParameters);
        } catch (IOException e) {
            log.error("ZipUtils error {}", e.getMessage(), e);
            throw new BizException("压缩文件异常");
        }
    }

    /**
     * 压缩多个文件到一个压缩包中
     * 或者向已有Zip文件中添加多个文件
     *
     * @param fileList    要压缩的文件列表
     * @param zipFileName 生成的压缩文件名
     * @throws BizException 如果压缩过程中发生错误
     */
    public static void compressMultipleFiles(List<String> fileList, String zipFileName) {
        ZipUtils.compressMultipleFiles(fileList, zipFileName, null);
    }

    /**
     * 压缩多个文件到一个压缩包中
     * 或者向已有Zip文件中添加多个文件
     *
     * @param fileList       要压缩的文件列表
     * @param zipFileName    生成的压缩文件名
     * @param passwordString 压缩文件的密码
     * @throws BizException 如果压缩过程中发生错误
     */
    public static void compressMultipleFiles(List<String> fileList, String zipFileName, String passwordString) {
        // 密码不为空则加密文件
        ZipParameters zipParameters = StringUtils.isNotBlank(passwordString)
                ? ZipUtils.getZipParameters(true)
                : ZipUtils.getZipParameters(false);
        char[] password = StringUtils.isNotBlank(passwordString)
                ? passwordString.toCharArray()
                : null;

        List<File> filesToAdd = new ArrayList<>();
        for (String originFile : fileList) {
            filesToAdd.add(new File(originFile));
        }

        try (ZipFile zipFile = new ZipFile(zipFileName, password)) {
            zipFile.addFiles(filesToAdd, zipParameters);
        } catch (IOException e) {
            log.error("ZipUtils error {}", e.getMessage(), e);
            throw new BizException("压缩文件异常");
        }
    }

    /**
     * 创建切分zip文件
     * 如果您想在大小超过特定限制时将zip文件拆分为多个文件可以使用此方法
     *
     * @param fileList    要压缩的文件列表
     * @param zipFileName 生成的压缩文件名
     * @throws BizException 如果压缩过程中发生错误
     */
    public static void createSplitZipFile(List<String> fileList, String zipFileName) {
        long splitLength = 100 * 1024 * 1024;
        ZipUtils.createSplitZipFile(fileList, zipFileName, splitLength);
    }

    /**
     * 创建切分zip文件
     * 如果您想在大小超过特定限制时将zip文件拆分为多个文件可以使用此方法
     *
     * @param fileList    要压缩的文件列表
     * @param zipFileName 生成的压缩文件名
     * @param splitLength 切分文件大小
     * @throws BizException 如果压缩过程中发生错误
     */
    public static void createSplitZipFile(List<String> fileList, String zipFileName, long splitLength) {
        ZipUtils.createSplitZipFile(fileList, zipFileName, null, splitLength);
    }

    /**
     * 创建切分zip文件
     * 如果您想在大小超过特定限制时将zip文件拆分为多个文件可以使用此方法
     *
     * @param fileList       要压缩的文件列表
     * @param zipFileName    生成的压缩文件名
     * @param passwordString 压缩文件的密码
     * @throws BizException 如果压缩过程中发生错误
     */
    public static void createSplitZipFile(List<String> fileList, String zipFileName, String passwordString) {
        // 默认100M
        long splitLength = 100 * 1024 * 1024;
        ZipUtils.createSplitZipFile(fileList, zipFileName, passwordString, splitLength);
    }

    /**
     * 创建切分zip文件
     * 如果您想在大小超过特定限制时将zip文件拆分为多个文件可以使用此方法
     *
     * @param fileList       要压缩的文件列表
     * @param zipFileName    生成的压缩文件名
     * @param passwordString 压缩文件的密码
     * @param splitLength    切分文件大小
     * @throws BizException 如果压缩过程中发生错误
     */
    public static void createSplitZipFile(List<String> fileList, String zipFileName, String passwordString, long splitLength) {
        // 密码不为空则加密文件
        ZipParameters zipParameters = StringUtils.isNotBlank(passwordString)
                ? ZipUtils.getZipParameters(true)
                : ZipUtils.getZipParameters(false);
        char[] password = StringUtils.isNotBlank(passwordString)
                ? passwordString.toCharArray()
                : null;

        List<File> filesToAdd = new ArrayList<>();
        for (String originFile : fileList) {
            filesToAdd.add(new File(originFile));
        }

        try (ZipFile zipFile = new ZipFile(zipFileName, password)) {
            zipFile.createSplitZipFile(filesToAdd, zipParameters, true, splitLength);
        } catch (IOException e) {
            log.error("ZipUtils error {}", e.getMessage(), e);
            throw new BizException("压缩文件异常");
        }
    }

    /**
     * 创建切分zip文件
     * 如果您想在大小超过特定限制时将zip文件拆分为多个文件可以使用此方法
     *
     * @param folder      要压缩的文件夹
     * @param zipFileName 生成的压缩文件名
     * @throws BizException 如果压缩过程中发生错误
     */
    public static void createSplitZipFileFromFolder(String folder, String zipFileName) {
        // 默认100M
        long splitLength = 100 * 1024 * 1024;
        ZipUtils.createSplitZipFileFromFolder(folder, zipFileName, null, splitLength);
    }

    /**
     * 创建切分zip文件
     * 如果您想在大小超过特定限制时将zip文件拆分为多个文件可以使用此方法
     *
     * @param folder         要压缩的文件夹
     * @param zipFileName    生成的压缩文件名
     * @param passwordString 压缩文件的密码
     * @throws BizException 如果压缩过程中发生错误
     */
    public static void createSplitZipFileFromFolder(String folder, String zipFileName, String passwordString) {
        long splitLength = 100 * 1024 * 1024;
        ZipUtils.createSplitZipFileFromFolder(folder, zipFileName, passwordString, splitLength);
    }

    /**
     * 创建切分zip文件
     * 如果您想在大小超过特定限制时将zip文件拆分为多个文件可以使用此方法
     *
     * @param folder         要压缩的文件夹
     * @param zipFileName    生成的压缩文件名
     * @param passwordString 压缩文件的密码
     * @param splitLength    切分文件大小
     * @throws BizException 如果压缩过程中发生错误
     */
    public static void createSplitZipFileFromFolder(String folder, String zipFileName, String passwordString, long splitLength) {
        // 密码不为空则加密文件
        ZipParameters zipParameters = StringUtils.isNotBlank(passwordString)
                ? ZipUtils.getZipParameters(true)
                : ZipUtils.getZipParameters(false);
        char[] password = StringUtils.isNotBlank(passwordString)
                ? passwordString.toCharArray()
                : null;

        try (ZipFile zipFile = new ZipFile(zipFileName, password)) {
            zipFile.createSplitZipFileFromFolder(new File(folder), zipParameters, false, splitLength);
        } catch (IOException e) {
            log.error("ZipUtils error {}", e.getMessage(), e);
            throw new BizException("压缩文件异常");
        }
    }

    /**
     * 压缩指定文件夹到一个zip文件中
     *
     * @param folder      待压缩文件夹的路径
     * @param zipFileName 生成的zip文件的名称
     * @throws BizException 当压缩过程中发生错误时抛出
     */
    public static void compressFolder(String folder, String zipFileName) {
        ZipUtils.compressFolder(folder, zipFileName, null);
    }

    /**
     * 压缩指定文件夹到一个zip文件中
     *
     * @param folder         待压缩文件夹的路径
     * @param zipFileName    生成的zip文件的名称
     * @param passwordString 压缩文件的密码
     * @throws BizException 当压缩过程中发生错误时抛出
     */
    public static void compressFolder(String folder, String zipFileName, String passwordString) {
        // 密码不为空则加密文件
        ZipParameters zipParameters = StringUtils.isNotBlank(passwordString)
                ? ZipUtils.getZipParameters(true)
                : ZipUtils.getZipParameters(false);
        char[] password = StringUtils.isNotBlank(passwordString)
                ? passwordString.toCharArray()
                : null;

        try (ZipFile zipFile = new ZipFile(zipFileName, password)) {
            zipFile.addFolder(new File(folder), zipParameters);
        } catch (Exception e) {
            log.error("ZipUtils error {}", e.getMessage(), e);
            throw new BizException("压缩文件异常");
        }
    }

    /**
     * 压缩输入流到指定的ZIP文件
     *
     * @param inputStream 输入流,表示要压缩的文件数据
     * @param zipFileName 压缩后的ZIP文件名
     * @throws BizException 如果在压缩过程中发生IO异常
     */
    public static void compressInputStream(InputStream inputStream, String zipFileName, String fileNameInZip) {
        ZipUtils.compressInputStream(inputStream, zipFileName, fileNameInZip, null);
    }

    /**
     * 压缩输入流到指定的ZIP文件,并使用可选的密码保护
     *
     * @param inputStream    输入流,表示要压缩的文件数据
     * @param zipFileName    压缩后的ZIP文件名
     * @param passwordString 可选的密码,如果为空则不使用密码保护
     * @throws BizException 如果在压缩过程中发生IO异常
     */
    public static void compressInputStream(InputStream inputStream, String zipFileName, String fileNameInZip, String passwordString) {
        // 密码不为空则加密文件
        ZipParameters zipParameters = StringUtils.isNotBlank(passwordString)
                ? ZipUtils.getZipParameters(true)
                : ZipUtils.getZipParameters(false);
        char[] password = StringUtils.isNotBlank(passwordString)
                ? passwordString.toCharArray()
                : null;

        zipParameters.setFileNameInZip(fileNameInZip);
        try (ZipFile zipFile = new ZipFile(zipFileName, password)) {
            zipFile.addStream(inputStream, zipParameters);
        } catch (IOException e) {
            log.error("ZipUtils error {}", e.getMessage(), e);
            throw new BizException("压缩文件异常");
        }
    }

    /**
     * 获取Zip参数配置
     *
     * @param encryptFiles 是否加密文件
     * @return ZipParameters 配置的Zip参数
     */
    public static ZipParameters getZipParameters(boolean encryptFiles) {
        ZipParameters zipParameters = new ZipParameters();
        zipParameters.setEncryptFiles(encryptFiles);
        zipParameters.setEncryptionMethod(EncryptionMethod.ZIP_STANDARD);
        return zipParameters;
    }

    /**
     * 解压缩指定的文件中的某个文件到目标路径
     *
     * @param zipFileName     ZIP 文件的名称
     * @param fileNameInZip   需要解压的文件名称
     * @param destinationPath 解压后文件的目标路径
     * @throws BizException 如果解压过程中出现异常
     */
    public static void extractFile(String zipFileName, String fileNameInZip, String destinationPath) {
        ZipUtils.extractFile(zipFileName, fileNameInZip, destinationPath, null);
    }

    /**
     * 解压指定的ZIP文件中的某个文件到目标路径
     *
     * @param zipFileName     ZIP文件的名称
     * @param passwordString  解压ZIP文件所需的密码
     * @param fileNameInZip   需要解压的文件名称
     * @param destinationPath 解压后的目标路径
     * @throws BizException 如果解压过程中发生异常
     */
    public static void extractFile(String zipFileName, String fileNameInZip, String destinationPath, String passwordString) {
        char[] password = StringUtils.isNotBlank(passwordString)
                ? passwordString.toCharArray()
                : null;

        try (ZipFile zipFile = new ZipFile(zipFileName, password)) {
            zipFile.extractFile(fileNameInZip, destinationPath);
        } catch (Exception e) {
            log.error("ZipUtils error {}", e.getMessage(), e);
            throw new BizException("解压文件异常");
        }
    }

    /**
     * 解压缩指定的文件到目标路径
     *
     * @param zipFileName     ZIP 文件的名称
     * @param destinationPath 解压后文件的目标路径
     * @throws BizException 如果解压过程中出现异常
     */
    public static void extractAllFile(String zipFileName, String destinationPath) {
        ZipUtils.extractAllFile(zipFileName, destinationPath, null);
    }

    /**
     * 解压指定的ZIP文件到目标路径。
     *
     * @param zipFileName     ZIP文件的名称
     * @param passwordString  解压ZIP文件所需的密码
     * @param destinationPath 解压后的目标路径
     * @throws BizException 如果解压过程中发生异常
     */
    public static void extractAllFile(String zipFileName, String destinationPath, String passwordString) {
        char[] password = StringUtils.isNotBlank(passwordString)
                ? passwordString.toCharArray()
                : null;

        try (ZipFile zipFile = new ZipFile(zipFileName, password)) {
            zipFile.extractAll(destinationPath);
        } catch (Exception e) {
            log.error("ZipUtils error {}", e.getMessage(), e);
            throw new BizException("解压文件异常");
        }
    }

    /**
     * 从压缩包中获取文件流
     *
     * @param zipFileName   压缩后的ZIP文件名
     * @param fileNameInZip 输入流,表示要压缩的文件数据
     * @throws BizException 如果在压缩过程中发生IO异常
     */
    public static InputStream getInputStreamFromZip(String zipFileName, String fileNameInZip) {
        return ZipUtils.getInputStreamFromZip(zipFileName, fileNameInZip, null);
    }

    /**
     * 从压缩包中获取文件流
     *
     * @param zipFileName   压缩后的ZIP文件名
     * @param fileNameInZip 输入流,表示要压缩的文件数据
     * @throws BizException 如果在压缩过程中发生IO异常
     */
    public static InputStream getInputStreamFromZip(String zipFileName, String fileNameInZip, String passwordString) {
        char[] password = StringUtils.isNotBlank(passwordString)
                ? passwordString.toCharArray()
                : null;

        try (ZipFile zipFile = new ZipFile(zipFileName, password)) {
            FileHeader fileHeader = zipFile.getFileHeader(fileNameInZip);
            return zipFile.getInputStream(fileHeader);
        } catch (IOException e) {
            log.error("ZipUtils error {}", e.getMessage(), e);
            throw new BizException("从压缩包中获取文件流异常");
        }
    }

    /**
     * 列出ZIP文件中的所有文件名
     * 列出文件名也不需要密码
     *
     * @param zipFileName ZIP文件的文件名
     * @return ZIP文件中所有文件名的列表
     * @throws BizException 如果在处理ZIP文件时发生异常
     */
    public static List<String> listAllFilesInZip(String zipFileName) {
        try (ZipFile zipFile = new ZipFile(zipFileName)) {
            List<FileHeader> fileHeaders = zipFile.getFileHeaders();
            return fileHeaders.stream()
                    .map(AbstractFileHeader::getFileName)
                    .toList();
        } catch (Exception e) {
            log.error("ZipUtils error {}", e.getMessage(), e);
            throw new BizException("列出ZIP文件中的所有文件名异常");
        }
    }

    /**
     * 从压缩文件中移除指定文件
     * 删除文件无须密码
     *
     * @param zipFileName   压缩文件的名称
     * @param fileNameInZip 压缩文件中要移除的文件的名称
     * @throws BizException 当移除文件时发生异常
     */
    public static void removeFileFromZip(String zipFileName, String fileNameInZip) {
        try (ZipFile zipFile = new ZipFile(zipFileName)) {
            zipFile.removeFile(fileNameInZip);
        } catch (Exception e) {
            log.error("ZipUtils error {}", e.getMessage(), e);
            throw new BizException("从压缩包中移除文件异常");
        }
    }

    /**
     * 设置压缩文件的注释
     *
     * @param zipFileName 压缩文件的文件名
     * @param comment     要设置的注释内容
     * @throws BizException 当设置注释时发生异常
     */
    public static void setCommentForZip(String zipFileName, String comment) {
        try (ZipFile zipFile = new ZipFile(zipFileName)) {
            zipFile.setComment(comment);
        } catch (Exception e) {
            log.error("ZipUtils error {}", e.getMessage(), e);
            throw new BizException("设置压缩文件的注释异常");
        }
    }

    /**
     * 获取压缩文件的注释
     *
     * @param zipFileName 压缩文件的文件名
     * @throws BizException 当设置注释时发生异常
     */
    public static String getCommentForZip(String zipFileName) {
        try (ZipFile zipFile = new ZipFile(zipFileName)) {
            return zipFile.getComment();
        } catch (Exception e) {
            log.error("ZipUtils error {}", e.getMessage(), e);
            throw new BizException("获取压缩文件的注释异常");
        }
    }

}



三、测试类

@Test
    public void testCompressFile() {
        String filePath = "D:\\mytmp\\1948321_通用计费报表\\";
        String name = "1963692_通用计费报表_1.csv";
        String fileName = filePath + name;
        String zipFileName = filePath + "通用计费报表1.zip";
        String zipFileName2 = filePath + "通用计费报表2.zip";
        String zipFileName3 = filePath + "12.txt";

        ZipUtils.compressFile(fileName, zipFileName);
        ZipUtils.setCommentForZip(zipFileName, "abcdefghi123");
        System.out.println(ZipUtils.getCommentForZip(zipFileName));

        //ZipUtils.compressFile(fileName, zipFileName2, "123456");
        //ZipUtils.compressFile(zipFileName, zipFileName2, "123456");
        //ZipUtils.compressFile(zipFileName3, zipFileName2, "123456");

        ZipUtils.compressFile(fileName, zipFileName2);
        ZipUtils.compressFile(zipFileName, zipFileName2);
        ZipUtils.compressFile(zipFileName3, zipFileName2);

        List<String> files = ZipUtils.listAllFilesInZip(zipFileName2);
        System.out.println(JSON.toJSONString(files));
        ZipUtils.removeFileFromZip(zipFileName2, files.get(0));

        List<String> files2 = ZipUtils.listAllFilesInZip(zipFileName2);
        System.out.println(JSON.toJSONString(files2));

        ZipUtils.extractAllFile(zipFileName2, "D:\\mytmp\\excel");
        //ZipUtils.extractAllFile(zipFileName2, "D:\\mytmp\\excel", "123456");
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值