最近项目中有个需求需要对文件夹进行压缩后传输,考虑数据泄露安全性问题,需要对压缩包进行加密,特地查找了下开源压缩加密类库,找到了java语言开发的zip4j库,觉得挺好用的,在这分享给大家!
java项目引入使用步骤如下:
1、引入maven依赖
<dependency>
<groupid>net.lingala.zip4j</groupid>
<artifactid>zip4j</artifactid>
<version>2.11.5</version>
</dependency>2、封装的工具类
import net.lingala.zip4j.zipfile;
import net.lingala.zip4j.exception.zipexception;
import net.lingala.zip4j.model.zipparameters;
import net.lingala.zip4j.model.enums.aeskeystrength;
import net.lingala.zip4j.model.enums.compressionlevel;
import net.lingala.zip4j.model.enums.compressionmethod;
import net.lingala.zip4j.model.enums.encryptionmethod;
import org.apache.commons.lang3.stringutils;
import org.slf4j.logger;
import org.slf4j.loggerfactory;
import java.io.file;
import java.util.arraylist;
import java.util.list;
/**
* @desc zip解压缩工具
* @author: wcy
* @date: 2024/1/12
* @version: 1.0
*/
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 {
// 生成的压缩文件
zipfile zipfile = new zipfile(zippathfilename);
if (stringutils.isnotempty(password)) {
zipfile.setpassword(password.tochararray());
}
zipparameters parameters = new zipparameters();
// 压缩级别
parameters.setcompressionmethod(compressionmethod.deflate);
parameters.setcompressionlevel(compressionlevel.normal);
if(stringutils.isnotempty(password)){
parameters.setencryptfiles(true);
parameters.setencryptionmethod(encryptionmethod.aes);
parameters.setaeskeystrength(aeskeystrength.key_strength_256);
}
// 要打包的文件夹
file file = new file(srcfilepath);
if (file.isdirectory()) {
zipfile.addfolder(file, parameters);
} else {
zipfile.addfile(file, parameters);
}
return true;
} catch (zipexception e) {
e.printstacktrace();
log.error("压缩文件【"+srcfilepath+"】到路径【"+zippathfilename+"】失败:\n"+e.getmessage());
return false;
}
}
/**
* @param zipfilefullname zip文件所在的路径名
* @param filepath 解压到的路径
* @param password 需要解压的密码
* @return
*/
public static boolean unzipfile(string zipfilefullname, string filepath, string password) {
try {
zipfile zipfile = new zipfile(zipfilefullname);
// 如果解压需要密码
if(stringutils.isnotempty(password) && zipfile.isencrypted()) {
zipfile.setpassword(password.tochararray());
}
zipfile.extractall(filepath);
return true;
} catch (zipexception e) {
e.printstacktrace();
log.error("解压文件【"+zipfilefullname+"】到路径【"+filepath+"】失败:\n"+e.getmessage());
return false;
}
}
/**
* 添加文件到压缩文件中
* @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(compressionmethod.deflate);
parameters.setcompressionlevel(compressionlevel.normal);
if(stringutils.isnotempty(rootfolderinzip)){
if(!rootfolderinzip.endswith("/")){
rootfolderinzip = rootfolderinzip+"/";
}
parameters.setrootfoldernameinzip(rootfolderinzip);
}
zipfile.addfiles(addfiles, parameters);
return true;
} catch (zipexception e) {
e.printstacktrace();
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) {
e.printstacktrace();
log.error("删除文件失败:\n"+e.getmessage());
return false;
}
}
public static void main(string[] args) throws zipexception {
string srcfilepath = "c:\\users\\test\\desktop\\project\\video";
string desfilepath = "c:\\users\\test\\desktop\\project\\file";
string zippathfilename = "c:\\users\\test\\desktop\\project\\video.zip";
string password = "";
long begin = system.currenttimemillis();
boolean zipresult = zipfile(srcfilepath, zippathfilename, password);
long end = system.currenttimemillis();
system.out.println("压缩结果:" + zipresult + ",耗时:" + (end - begin) + "ms");
boolean unzipresult = unzipfile(zippathfilename, desfilepath, password);
long end2 = system.currenttimemillis();
system.out.println("解压结果:" + unzipresult + ",耗时:" + (end2 - end) + "ms");
system.out.println(unzipresult);
}
}3、测试结果
压缩结果:true,耗时:3281ms
解压结果:true,耗时:590ms
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论