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