一、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");
}