当前位置: 代码网 > it编程>编程语言>Java > Java使用zip4j加密压缩和解压文件与文件夹方式

Java使用zip4j加密压缩和解压文件与文件夹方式

2025年12月27日 Java 我要评论
最近项目中有个需求需要对文件夹进行压缩后传输,考虑数据泄露安全性问题,需要对压缩包进行加密,特地查找了下开源压缩加密类库,找到了java语言开发的zip4j库,觉得挺好用的,在这分享给大家!java项

最近项目中有个需求需要对文件夹进行压缩后传输,考虑数据泄露安全性问题,需要对压缩包进行加密,特地查找了下开源压缩加密类库,找到了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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com