引入Maven依赖
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>2.10.0</version>
</dependency>
Zip4j工具类文件
/**
* @author edward
* @className ZipUtil
* @description: Zip工具类
* @date 2022/5/20 16:26
**/
public class ZipUtil {
private static final Logger log = LoggerFactory.getLogger(ZipUtil.class);
/**
* 压缩指定路径的文件
* @param srcFilePath 待压缩文件路径
* @param zipPathFileName 将已压缩的zip文件存放到指定的全路径名
* @param password 加密密码
* @return
*/
public static boolean zipFile(String srcFilePath,String zipPathFileName,String password){
try {
/* 截取zipPathFileName最后一个/前面的全路径名,如果不存在则创建相应的文件夹 */
String substring = zipPathFileName.substring(0,zipPathFileName.lastIndexOf("/"));
File subFile = new File(substring);
if(!subFile.exists()){
//建立多级文件夹
subFile.mkdirs();
}
/* 创建ZipFile,用于压缩文件 */
ZipFile zipFile = null;
/* 有密码时进行加密压缩 */
if(!StringUtils.isEmpty(password)){
//生成的压缩文件
zipFile = new ZipFile(zipPathFileName,password.toCharArray());
}else{
//无密码时进行压缩
zipFile = new ZipFile(zipPathFileName);
}
File[] files = null;
File currentFile = new File(srcFilePath);
if(!currentFile.isFile()){
files = currentFile.listFiles();
}
/* 创建ZipParameter对象,用于设置加密属性 */
ZipParameters zipParameters = null;
/* 设置Zip4j加密属性 */
zipParameters = setEncryptProperty(password);
//将待压缩文件和文件夹进行加密压缩
//遍历文件夹下所有文件、文件夹
if(!StringUtils.isEmpty(files)){
for (File file : files) {
if(file.isDirectory()){
zipFile.addFolder(file,zipParameters);
}else{
zipFile.addFile(file,zipParameters);
}
}
}else if(StringUtils.isEmpty(files) && (!StringUtils.isEmpty(currentFile))){
if(currentFile.isDirectory()){
zipFile.addFolder(currentFile,zipParameters);
}else{
zipFile.addFile(currentFile,zipParameters);
}
}
return true;
} catch (IOException e) {
e.printStackTrace();
log.error("压缩文件【{}】到路径【{}】失败:\n{}",srcFilePath,zipPathFileName,e.getMessage());
return false;
}
}
/**
* 解压指定路径的文件
* @param zipFileFullName zip文件所在的路径名
* @param filePath 解压到的路径
* @param password 需要解压的密码
* @return boolean
* @description 该方法filePath必须传指定文件夹目录路径,而不能是根目录,这里是源代码的问题,要处理需改写源代码
*/
public static boolean unZipFile(String zipFileFullName,String filePath,String password){
try {
ZipFile zipFile = new ZipFile(zipFileFullName);
//判断解压是否需要密码
if(!StringUtils.isEmpty(password) && zipFile.isEncrypted()){
zipFile.setPassword(password.toCharArray());
}
/*File file = new File(filePath);
if(!file.exists()){
//建立多级文件夹
file.mkdirs();
}*/
//解压文件数据到指定的路径
zipFile.extractAll(filePath);
return true;
} catch (ZipException e) {
e.printStackTrace();
log.error("解压文件【{}】到路径【{}】失败:{}\n",zipFileFullName,filePath,e.getMessage());
return false;
}
}
/**
* 添加文件到压缩文件中
* @param zipFullFileName zip文件所在路径及全名
* @param fullFileNameList 待添加的文件全路径集合
* @param rootFolderInZip 在压缩文件里的文件夹名
* @param password 添加文件到压缩文件中的密码,如果源文件有密码不冲突
* @return boolean
*/
public static boolean addFilesToZip(String zipFullFileName, List<String> fullFileNameList,String rootFolderInZip,String password){
try {
ZipFile zipFile = null;
ArrayList<File> addFiles = new ArrayList<>();
for (String fileName : fullFileNameList) {
addFiles.add(new File(fileName));
}
/* 创建ZipParameter对象,用于设置加密属性 */
ZipParameters zipParameters = null;
if(!StringUtils.isEmpty(password)){
zipFile = new ZipFile(zipFullFileName,password.toCharArray());
/* 设置Zip4j加密属性 */
zipParameters = setEncryptProperty(password);
}else{
zipFile = new ZipFile(zipFullFileName);
/* 设置Zip4j默认属性 */
zipParameters = new ZipParameters();
zipParameters.setCompressionMethod(CompressionMethod.DEFLATE);
zipParameters.setCompressionLevel(CompressionLevel.NORMAL);
}
if(!StringUtils.isEmpty(rootFolderInZip)){
if(rootFolderInZip.endsWith("/") == false){
rootFolderInZip += "/";
}
zipParameters.setRootFolderNameInZip(rootFolderInZip);
}
zipFile.addFiles(addFiles,zipParameters);
return true;
} catch (ZipException e) {
e.printStackTrace();
log.error("添加文件夹失败:{}\n",e.getMessage());
return false;
}
}
private static ZipParameters setEncryptProperty(String password) {
ZipParameters zipParameters = new ZipParameters();
//压缩级别
zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); //采用DEFLATE压缩算法压缩
/*
* CompressionLevel.NO_COMPRESSION 0级 不压缩
* CompressionLevel.FASTEST 2级 最低压缩级别但更高的压缩速度
* CompressionLevel.FAST 3级 低压缩级别但更高的压缩速度
* CompressionLevel.NORMAL 5级 压缩级别/速度之间的最佳平衡
* CompressionLevel.MAXIMUM 7级 高压缩水平,速度妥协
* CompressionLevel.ULTRA 9级 最高压缩级别但低速
*/
zipParameters.setCompressionLevel(CompressionLevel.NORMAL);
if(!StringUtils.isEmpty(password)){
//设置文件被加密的标志
zipParameters.setEncryptFiles(true);
/*
* EncryptionMethod.NONE 不执行加密
* EncryptionMethod.ZIP_STANDARD 使用弱 ZIP 标准算法加密
* EncryptionMethod.ZIP_STANDARD_VARIANT_STRONG 使用更强的 ZIP 标准算法加密
* EncryptionMethod.AES 使用 AES 加密,是目前最强的选择,但无法在 Windows 资源管理器中展开
*/
zipParameters.setEncryptionMethod(EncryptionMethod.AES);
/*
* AesKeyStrength.KEY_STRENGTH_128 采用128位强度加密
* AesKeyStrength.KEY_STRENGTH_192 采用192位强度加密
* AesKeyStrength.KEY_STRENGTH_256 采用256位强度加密
*/
zipParameters.setAesKeyStrength(AesKeyStrength.KEY_STRENGTH_128);
}
return zipParameters;
}
/**
* 从压缩文件中删除路径
* @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) {
e.printStackTrace();
log.error("删除文件失败:{}\n",e.getMessage());
return false;
}
}
}
测试方法
public class Demo01 {
private static final Logger log = LoggerFactory.getLogger(Demo01.class);
@Test
public void test01(){
boolean status = ZipUtil.zipFile("E:/KuGou", "E:/test-jar.zip",null);
log.info(String.valueOf(status));
}
@Test
public void test02(){
ZipUtil.unZipFile("E:/test/test2/test-jar.zip","E:/test3/","123456");
}
@Test
public void test03(){
List<String> fullFileNameList = new ArrayList<>();
fullFileNameList.add("E:/音乐/游戏音乐/古剑奇谭/彩云追月.flac");
fullFileNameList.add("E:/音乐/游戏音乐/古剑奇谭/湖天春色.flac");
fullFileNameList.add("E:/备份/u.sql");
ZipUtil.addFilesToZip("E:/test/test2/test-jar.zip",fullFileNameList,"music2/misic","123456");
}
@Test
public void test04(){
ZipUtil.deleteFileInZip("E:/test/test2/test-jar.zip","music");
}
}