当前位置: 首页 > 工具软件 > ZIP4J > 使用案例 >

Zip4j加密工具类封装

孔彭祖
2023-12-01

前言:这个工具类版本是Zip4j的2.10.0,该版本对比流传的1.3.2版语法有些区别,方法均已实测,有需要自取


引入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");
    }

}
 类似资料: