Java 压缩文件工具类 Zip4jUtils

采用 zip4j1.3.3版本

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.FileHeader;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;
import net.lingala.zip4j.util.Zip4jUtil;

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

/**
* Zip压缩/解压缩文件工具类
* @date 2020/9/7 - 9:59
*/
public class Zip4jUtils {

    /**
     * 多文件压缩
     * @param targetName 文件压缩之后输出路径
     * @param filesPath 待压缩的文件路径
     * @param delSrcFile 是否删除源文件
     */
    public static void zipFile(String[] filesPath,String targetName,boolean delSrcFile) throws ZipException{
        //文件压缩路径
        ZipFile zipFile = new ZipFile(SeedConfig.getUploadPath() + targetName);
        //被压缩的文件路径
        ArrayList<File> filesToAdd = new ArrayList<>();
        for(String filePath : filesPath){
            File file = new File(SeedConfig.getUploadPath() + filePath);
            if(!file.exists()){
                throw new CustomException("文件不存在,无法进行压缩!");
            }
            filesToAdd.add(file);
        }
        //设置压缩参数
        ZipParameters parameters = setParameters(false,"");
        zipFile.addFiles(filesToAdd, parameters);
        //删除源文件
        if(delSrcFile){
            for(String srcFile : filesPath){
                if(new File(SeedConfig.getUploadPath() + srcFile).exists()){
                    if(!new File(SeedConfig.getUploadPath() + srcFile).delete()){
                        throw new CustomException("多文件压缩,删除源文件失败!");
                    }
                }
            }
        }
    }

    /**
     * 多文件压缩-加密
     * @param targetName 文件压缩之后输出路径
     * @param filesPath 被压缩的文件路径
     * @param password 密码
     * @param delSrcFile 是否删除源文件
     */
    public static void zipFile(String[] filesPath, String targetName, String password,boolean delSrcFile) throws ZipException{
        //文件压缩路径
        ZipFile zipFile = new ZipFile(SeedConfig.getUploadPath() + targetName);
        //被压缩的文件路径
        ArrayList<File> filesToAdd = new ArrayList<>();
        for(String filePath : filesPath){
            File file = new File(SeedConfig.getUploadPath() + filePath);
            if(!file.exists()){
                throw new CustomException("文件不存在,无法进行压缩!");
            }
            filesToAdd.add(file);
        }
        //设置压缩参数
        ZipParameters parameters = setParameters(true,password);
        zipFile.addFiles(filesToAdd, parameters);
        //删除源文件
        if(delSrcFile){
            for(String srcFile : filesPath){
                if(new File(SeedConfig.getUploadPath() + srcFile).exists()){
                    if(!new File(SeedConfig.getUploadPath() + srcFile).delete()){
                        throw new CustomException("多文件压缩-加密,删除源文件失败!");
                    }
                }
            }
        }
    }



    /**
     * 单文件压缩,将指定路径下的文件压缩至指定zip文件,
     * @param srcFilePath 待压缩文件路径
     * @param targetName 压缩后文件路径
     * @param delSrcFile 是否删除源文件
     */
    public static void zipFile(String srcFilePath,String targetName,boolean delSrcFile) throws Exception {
        ZipFile zipFile = new ZipFile(SeedConfig.getUploadPath() + targetName);
        if(!new File(SeedConfig.getUploadPath() + srcFilePath).exists()){
            throw new CustomException("文件不存在,无法进行压缩!");
        }
        ArrayList<File> filesToAdd = new ArrayList<>();
        filesToAdd.add(new File(SeedConfig.getUploadPath() + srcFilePath));
        //设置压缩参数
        ZipParameters parameters = setParameters(false,"");
        //开始压缩
        zipFile.addFiles(filesToAdd, parameters);
        //删除源文件
        if(delSrcFile){
            File file = new File(SeedConfig.getUploadPath() + srcFilePath);
            if(file.exists()){
                if(!file.delete()){
                    throw new CustomException("压缩文件夹,删除源文件失败!");
                }
            }
        }
    }

    /**
     * 单文件压缩,将指定路径下的文件压缩至指定zip文件,
     * 并以指定密码加密 若密码为空,则不进行加密保护
     * @param srcFilePath 待压缩文件路径
     * @param targetName 压缩后文件路径
     * @param password 加密密码
     * @param delSrcFile 是否删除源文件
     */
    public static void zipFile(String srcFilePath,String targetName, String password, boolean delSrcFile) throws Exception {
        ZipFile zipFile = new ZipFile(SeedConfig.getUploadPath() + targetName);
        if(!new File(SeedConfig.getUploadPath() + srcFilePath).exists()){
            throw new CustomException("文件不存在,无法进行压缩!");
        }
        ArrayList<File> filesToAdd = new ArrayList<File>();
        filesToAdd.add(new File(SeedConfig.getUploadPath() + srcFilePath));
        //设置压缩参数
        ZipParameters parameters = setParameters(true,password);
        //开始压缩
        zipFile.addFiles(filesToAdd, parameters);
        //删除源文件
        if(delSrcFile) {
            File file = new File(SeedConfig.getUploadPath() + srcFilePath);
            if (file.exists()) {
                if (!file.delete()) {
                    throw new CustomException("压缩文件夹,删除源文件失败!");
                }
            }
        }
    }


    /**
     * 压缩文件夹
     * @param targetName 压缩后文件输出路径
     * @param srcFilePath 被压缩的文件夹路径
     * @param delSrcFile 是否删除源文件
     */
    public static void zipDir(String targetName,String srcFilePath, boolean delSrcFile) throws ZipException{
        ZipFile zipFile = new ZipFile(SeedConfig.getUploadPath() + targetName);
        if(!new File(SeedConfig.getUploadPath() + srcFilePath).exists()){
            throw new CustomException("文件不存在,无法进行压缩!");
        }
        //设置压缩参数
        ZipParameters parameters = setParameters(false,"");
        zipFile.addFolder(SeedConfig.getUploadPath() + srcFilePath, parameters);
        //删除源文件
        if(delSrcFile){
            File file = new File(SeedConfig.getUploadPath() + srcFilePath);
            if(file.exists()){
                if(!file.delete()){
                    throw new CustomException("压缩文件夹,删除源文件失败!");
                }
            }
        }
    }

    /**
     * 压缩文件夹-加密
     * @param targetName 压缩后文件输出路径
     * @param srcFilePath 被压缩的文件夹路径
     * @param password 加密密码
     * @param delSrcFile 是否删除源文件
     */
    public static void zipDir(String targetName,String srcFilePath,String password, boolean delSrcFile) throws ZipException{
        ZipFile zipFile = new ZipFile(SeedConfig.getUploadPath() + targetName);
        if(!new File(SeedConfig.getUploadPath() + srcFilePath).exists()){
            throw new CustomException("文件不存在,无法进行压缩!");
        }
        //设置压缩参数
        ZipParameters parameters = setParameters(true,password);
        zipFile.addFolder(SeedConfig.getUploadPath() + srcFilePath, parameters);
        //删除源文件
        if(delSrcFile){
            File file = new File(SeedConfig.getUploadPath() + srcFilePath);
            if(file.exists()){
                if(!file.delete()){
                    throw new CustomException("加密压缩文件夹,删除源文件失败!");
                }
            }
        }
    }

    /**
     * 压缩文件列表
     * @param folderToAdd 文件压缩输出路径
     */
    public static void zipShowList(String folderToAdd) throws ZipException{
        ZipFile zipFile = new ZipFile(folderToAdd);
        List<?> fileHeaderList = zipFile.getFileHeaders();
        for (Object header : fileHeaderList) {
            System.out.println("****File Details for: " + ((FileHeader) header).getFileName() + "*****");
            System.out.println("Name: " + ((FileHeader) header).getFileName());
            System.out.println("Compressed Size: " + ((FileHeader) header).getCompressedSize());
            System.out.println("Uncompressed Size: " + ((FileHeader) header).getUncompressedSize());
            System.out.println("CRC: " + ((FileHeader) header).getCrc32());
            System.out.println("************************************************************");
        }

    }

    /**
     * 设置参数,加密和加密方式,压缩级别等
     * @param isEncrypt 是否加密
     * @param password  加密密码
     * @date 2020/9/7 - 15:10
     */
    private static ZipParameters setParameters(boolean isEncrypt, String password) {
        ZipParameters parameters = new ZipParameters();
        //压缩算法
        parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
        //压缩等级
        parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
        if(isEncrypt){
            //开启设置密码
            parameters.setEncryptFiles(true);
            //标准加密
            //parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
            //AES加密
            parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
            parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
            //设置密码
            parameters.setPassword(password);
        }
        return parameters;
    }

    /**
     * 解压zip
     * @param targetName 解压之后输出的路径
     * @param srcPath 需要解压的文件路径
     * @param delSrcFile 是否删除源文件
     */
    public static void unzip(String targetName,String srcPath, boolean delSrcFile) throws ZipException{
        ZipFile zipFile = new ZipFile(SeedConfig.getUploadPath() + targetName);
        zipFile.extractAll(SeedConfig.getUploadPath() + srcPath);
        //删除源文件
        if(delSrcFile){
            File file = new File(SeedConfig.getUploadPath() + srcPath);
            if(file.exists()){
                if(!file.delete()){
                    throw new CustomException("解压文件,删除源文件失败!");
                }
            }
        }
    }

    /**
     * 解压带密码的zip
     * @param targetName 解压之后输出的路径
     * @param srcPath 需要解压的文件路径
     * @param password 解密密码
     * @param delSrcFile 是否删除源文件
     */
    public static void unzip(String targetName,String srcPath,String password, boolean delSrcFile) throws ZipException{
        ZipFile zipFile = new ZipFile(SeedConfig.getUploadPath() + targetName);
        if (zipFile.isEncrypted()) {
            zipFile.setPassword(password);
        }
        zipFile.extractAll(SeedConfig.getUploadPath() + srcPath);
        //删除源文件
        if(delSrcFile){
            File file = new File(SeedConfig.getUploadPath() + srcPath);
            if(file.exists()){
                if(!file.delete()){
                    throw new CustomException("解压带密码的压缩文件,删除源文件失败!");
                }
            }
        }
    }

}

SeedConfig.getUploadPath() 替换为自己的目录即可
CustomException 替换为自己的的异常类