因为jdk自带的zip不支持密码,所以使用第三方包

jar使用jdk1.8编译,但是兼容jdk1.7,部分功能可能会受影响,1.8以上正常

jar点我下载 zip4j.jar

import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.model.enums.EncryptionMethod;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Zip4Util {

    /**
     * @author: bughz
     * @description: 解压带密码的zip文件
     * @createDate: 2022-07-11 09:40:01
     * @param zipFilePath zip文件路径
     * @param password 解密密码
     * @param targetPath 解压路径
     * @return void
     */
    public static void UnzipByPassword(String zipFilePath,String password,String targetPath) throws ZipException {
        new ZipFile(zipFilePath, password.toCharArray()).extractAll(targetPath);
    }

    /**
     * @author: bughz
     * @description: 解压zip文件
     * @createDate: 2022-07-11 09:40:01
     * @param zipFilePath zip文件路径
     * @param targetPath 解压路径
     * @return void
     */
    public static void unzip(String zipFilePath,String targetPath) throws ZipException {
        new ZipFile(zipFilePath).extractAll(targetPath);
    }

    /**
     * @author: bughz
     * @description: 压缩带密码的zip文件(zip标准加密),如果zipPath存在,则将后续文件添加进zipPath
     * @createDate: 2022-07-11 09:43:07
     * @param zipPath 压缩路径以及文件名
     * @param password 加密密码
     * @param filePaths 文件、多个,必传 
     * @return void
     */
    public static void zipByPassword(String zipPath,String password,File... filePaths) throws ZipException {
        if(filePaths==null || filePaths.length==0){
            throw new ZipException("param(s) filePaths not null");
        }
        ZipParameters zipParameters = new ZipParameters();
        zipParameters.setEncryptFiles(true);
        zipParameters.setEncryptionMethod(EncryptionMethod.ZIP_STANDARD);
        ZipFile zipFile = new ZipFile(zipPath, password.toCharArray());
        setFilesOrDirectorys(zipFile,filePaths);
    }

    /**
     * @author: bughz
     * @description: 压缩zip文件(zip标准加密),如果zipPath存在,则将后续文件添加进zipPath
     *                 filePaths包含路径,打包时包含主目录例如 /app/test  打包后包含test
     * @createDate: 2022-07-11 09:43:07
     * @param zipPath 压缩路径以及文件名
     * @param filePaths 文件、多个,必传 
     * @return void
     */
    public static void zip(String zipPath,File... filePaths) throws ZipException {
        if(filePaths==null || filePaths.length==0){
            throw new ZipException("param(s) filePaths not null");
        }
        ZipFile zipFile = new ZipFile(zipPath);
        setFilesOrDirectorys(zipFile,filePaths);
    }

    /**
     * @author: bughz
     * @description: 压缩zip文件(zip标准加密),如果zipPath存在,则将后续文件添加进zipPath
     *                 filePaths不包含路径,打包时不包含主目录例如 /app/test  打包后主目录是test中的文件
     *                 多用于压缩目录
     * @createDate: 2022-07-11 09:43:07
     * @param zipPath 压缩路径以及文件名
     * @param noIndexDir true不包含主目录   no @see com.picc.piccbjepicc.util.Zip4Util.zip(String,File...)
     * @param filePaths 文件、多个,必传 
     * @return void
     */
    public static void zip(String zipPath,boolean noIndexDir,File... filePaths) throws ZipException {
        if(filePaths==null || filePaths.length==0){
            throw new ZipException("param(s) filePaths not null");
        }
        if(!noIndexDir){
            zip(zipPath,filePaths);
        }else{
            List<File> files=new ArrayList<>();
            for (File file:filePaths) {
                if(!file.exists()){
                    continue;
                }
                if(file.isFile()){
                    files.add(file);
                }else{
                    files.addAll(Arrays.asList(file.listFiles()));
                }
            }
            ZipFile zipFile = new ZipFile(zipPath);
            setFilesOrDirectorys(zipFile,files.toArray(new File[0]));
        }
    }

    /**
     * @author: bughz
     * @description: 删除文件
     * @createDate: 2022-07-11 09:51:29
     * @param files
     * @return void
     */
    public static void deleteFile(File... files){
        if (files == null) {
            return;
        }
        for (File file:files) {
            deleteDir(file);
        }
    }

    private static void setFilesOrDirectorys(ZipFile zipFile,File... fileOrDirectorys) throws ZipException {
        List<File> AllFiles=new ArrayList<>();
        for (File fileOrDirectory:fileOrDirectorys) {
            if(!fileOrDirectory.exists()){
                continue;
            }
            if(fileOrDirectory.isFile()){
                AllFiles.add(fileOrDirectory);
            }else{
                zipFile.addFolder(fileOrDirectory);
            }
        }
        if(!AllFiles.isEmpty()){
            zipFile.addFiles(AllFiles);
        }
    }

    private static void deleteDir(File fileOrDirectory){
        if(fileOrDirectory.isFile()){
            fileOrDirectory.delete();
            return;
        }
        //获取目录下所有文件和目录
        File files[] = fileOrDirectory.listFiles();
        for (File file : files) {
            if(file.isDirectory()){
                deleteDir(file);
            }else {
                file.delete();
            }
        }
        //最终把该目录也删除
        fileOrDirectory.delete();
    }
}