一、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) {// 默认100Mlong 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) {// 默认100Mlong 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("获取压缩文件的注释异常");}}}
三、测试类
@Testpublic 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");}