文件压缩解压工具类-含密码
一、zip4j简介
zip4j功能比较强大,支持加密、解密压缩,支持文件的添加、删除等。
zip4j官网:zip4j官网 - 可以在"download"页面下载官方示例进行学习
特征:
- 从 Zip 文件中创建、添加、提取、更新、删除文件
- 读/写受密码保护的 Zip 文件
- AES 128/256 加密/解密
- 标准 Zip 加密/解密
- Zip64 格式
- 存储(无压缩)和放气压缩方法
- 从 Split Zip 文件中创建或提取文件(例如:z01、z02、…zip)
- Unicode 文件名
- 进度监视器
二、zip4j工具类使用步骤
1.添加maven依赖
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 以下为工具类涉及的其他依赖 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
2.工具类代码
package com.ctsi.dbbackup.core.util;
import lombok.extern.slf4j.Slf4j;
import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;
import org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
1. 文件压缩解压工具类
2. 3. @Author 屋顶上的蜗牛·
3. @Date 2021-09-16
*/
@Slf4j
public class ZipUtil {
/**
* 压缩指定文件夹下的文件
*
* @param srcFilePath 待压缩的文件夹
* @param zipPathFileName 生成的压缩文件(是可以压缩zip/rar/gip等类型)存放全路径名
* @param password 加密密码
*/
public static void zipFile(String srcFilePath, String zipPathFileName, String password) {
try {
// 生成的压缩文件
ZipFile zipFile = new ZipFile(zipPathFileName);
ZipParameters parameters = new ZipParameters();
// 压缩级别
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
if (StringUtils.isNotEmpty(password)) {
parameters.setEncryptFiles(true);
parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
parameters.setPassword(password);
}
// 要打包的文件夹
File currentFile = new File(srcFilePath);
File[] fs = currentFile.listFiles();
if (Objects.isNull(fs) || fs.length == 0) {
throw new RuntimeException("文件夹下无任何文件...");
}
// 遍历文件夹下所有的文件、文件夹
for (File f : fs) {
if (f.isDirectory()) {
zipFile.addFolder(f.getPath(), parameters);
continue;
}
zipFile.addFile(f, parameters);
}
} catch (ZipException e) {
log.error("压缩文件【" + srcFilePath + "】到路径【" + zipPathFileName + "】失败:\n" + e.getMessage());
throw new RuntimeException("压缩文件失败...");
}
}
/**
* 解压文件
*
* @param zipFileFullName 待解压文件所在的全路径名
* @param filePath 解压到的目标路径
* @param password 需要解压的密码
*/
public static void unZipFile(String zipFileFullName, String filePath, String password) {
try {
ZipFile zipFile = new ZipFile(zipFileFullName);
// 如果解压需要密码
if (StringUtils.isNotEmpty(password) && zipFile.isEncrypted()) {
zipFile.setPassword(password);
}
zipFile.extractAll(filePath);
} catch (ZipException e) {
log.error("解压文件【" + zipFileFullName + "】到路径【" + filePath + "】失败:\n" + e.getMessage());
throw new RuntimeException("解压文件失败...");
}
}
/**
* 添加文件到压缩文件中
*
* @param zipFullFileName zip文件所在路径及全名
* @param fullFileNameList 待添加的文件全路径集合
* @param rootFolderInZip 在压缩文件里的文件夹名
* @return 结果
*/
public static boolean addFilesToZip(String zipFullFileName, List<String> fullFileNameList, String rootFolderInZip) {
try {
ZipFile zipFile = new ZipFile(zipFullFileName);
ArrayList<File> addFiles = new ArrayList<>();
for (String fileName : fullFileNameList) {
addFiles.add(new File(fileName));
}
ZipParameters parameters = new ZipParameters();
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
if (StringUtils.isNotEmpty(rootFolderInZip)) {
if (!rootFolderInZip.endsWith(File.separator)) {
rootFolderInZip = rootFolderInZip + File.separator;
}
parameters.setRootFolderInZip(rootFolderInZip);
}
zipFile.addFiles(addFiles, parameters);
return true;
} catch (ZipException e) {
log.error("添加文件失败:\n" + e.getMessage());
return false;
}
}
/**
* 从压缩文件中删除路径
*
* @param zipFullFileName 压缩文件全路径
* @param fileName 文件名
* @return 结果
*/
public static boolean deleteFileInZip(String zipFullFileName, String fileName) {
try {
ZipFile zipFile = new ZipFile(zipFullFileName);
zipFile.removeFile(fileName);
return true;
} catch (ZipException e) {
log.error("删除文件失败:\n" + e.getMessage());
return false;
}
}
}
3.调用测试
- main方法
public static void main(String[] args) {
zipFile("E:/opt/aaa", "E:/opt/aaa/test.zip", "123456");
}
- 结果
- 解压需输入压缩时的密码
三、结语
以上便是笔者使用zip4j自行封装的常用方法。若有出入的地方, 欢迎博友们指正,笔者感激不尽!