Zip4j 处理 zip 文件

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.14.0</version>
</dependency>
<dependency>
    <groupId>net.lingala.zip4j</groupId>
    <artifactId>zip4j</artifactId>
    <version>2.11.5</version>
</dependency>
import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.FileHeader;
import net.lingala.zip4j.model.ZipParameters;
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 java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

/**
 * zip 压缩包处理
 */
public class ZipUtils {

    /**
     * 压缩 - 带目录
     */
    public static String zipDir(String dirPath, String zipPath, String password) {
        try {
            File dirFile = new File(dirPath);
            if (!dirFile.exists()) {
                return null;
            }
            ZipParameters parameters = new ZipParameters();
            // 压缩方式
            parameters.setCompressionMethod(CompressionMethod.DEFLATE);
            // 压缩级别
            parameters.setCompressionLevel(CompressionLevel.NORMAL);

            // 加密
            ZipFile zipFile;
            if (StringUtils.isNotBlank(password)) {
                parameters.setEncryptFiles(true);
                parameters.setEncryptionMethod(EncryptionMethod.ZIP_STANDARD);
                zipFile = new ZipFile(zipPath, password.toCharArray());
            } else {
                zipFile = new ZipFile(zipPath);
            }

            if (dirFile.isDirectory()) {
                zipFile.addFolder(dirFile, parameters);
            } else {
                zipFile.addFile(dirFile, parameters);
            }
            return zipPath;
        } catch (IOException e) {
            return null;
        }
    }


    /**
     * 压缩 - 不带目录
     */
    public static String zip(String dirPath, String zipPath, String password) {
        try {
            File dirFile = new File(dirPath);
            if (!dirFile.exists()) {
                return null;
            }
            ZipParameters parameters = new ZipParameters();
            // 压缩方式
            parameters.setCompressionMethod(CompressionMethod.DEFLATE);
            // 压缩级别
            parameters.setCompressionLevel(CompressionLevel.NORMAL);

            // 加密
            ZipFile zipFile;
            if (StringUtils.isNotBlank(password)) {
                parameters.setEncryptFiles(true);
                parameters.setEncryptionMethod(EncryptionMethod.ZIP_STANDARD);
                zipFile = new ZipFile(zipPath, password.toCharArray());
            } else {
                zipFile = new ZipFile(zipPath);
            }

            if (dirFile.isDirectory()) {
                File[] files = dirFile.listFiles();
                if (files != null) {
                    for (File file : files) {
                        if (file.isDirectory()) {
                            zipFile.addFolder(file, parameters);
                        } else {
                            zipFile.addFile(file, parameters);
                        }
                    }
                }
            } else {
                zipFile.addFile(dirFile, parameters);
            }
            return zipPath;
        } catch (IOException e) {
            return null;
        }
    }


    /**
     * 解压缩
     */
    public static List<File> unzip(String dirPath, String zipPath, String password) {
        try {
            if (password == null) {
                password = "";
            }
            File sourceFile = new File(zipPath);
            if (!sourceFile.exists()) {
                return null;
            }
            ZipFile zipFile = new ZipFile(sourceFile, password.toCharArray());
            zipFile.setCharset(StandardCharsets.UTF_8);
            List<FileHeader> headers = zipFile.getFileHeaders();
            if (isRandomCode(headers)) {
                zipFile = new ZipFile(sourceFile, password.toCharArray());
                zipFile.setCharset(Charset.forName("GBK"));
                headers = zipFile.getFileHeaders();
            }
            File dirFile = new File(dirPath);
            if (!dirFile.exists()) {
                dirFile.mkdirs();
            }
            zipFile.extractAll(dirPath);
            ArrayList<File> extractFileList = new ArrayList<>();
            for (FileHeader header : headers) {
                if (header.getFileName().toLowerCase().contains("zip") || header.getFileName().toLowerCase().contains("rar")) {
                    File file = new File(dirFile, header.getFileName());
                    List<File> unzip = unzip(file.getAbsolutePath(), dirPath, password);
                    extractFileList.addAll(unzip);
                }
                if (!header.isDirectory() || !header.getFileName().toLowerCase().contains("zip") || !header.getFileName().toLowerCase().contains("rar")) {
                    extractFileList.add(new File(dirFile, header.getFileName()));
                }
            }
            return extractFileList;
        } catch (ZipException e) {
            return null;
        }
    }


    /**
     * 是否包含 GBK 编码
     */
    private static boolean isRandomCode(List<FileHeader> headers) {
        for (FileHeader header : headers) {
            boolean canEncode = Charset.forName("GBK").newEncoder().canEncode(header.getFileName());
            if (!canEncode) {
                return true;
            }
        }
        return false;
    }


    public static void main(String[] args) {
        String zip = zip("D:/test", "D:/test.zip", null);
        List<File> unzip = unzip("D:/test", "D:/test.zip", null);
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用 Zip4j 进行单文件压缩,可以按照以下步骤操作: 1. 首先需要下载并导入 Zip4j 库,可以在 Maven 中央仓库进行下载或者从官网下载 jar 包导入项目中。 2. 创建一个 ZipFile 对象,并指定要压缩的文件名和压缩后的文件名: ```java String sourceFile = "path/to/source/file"; String zipFile = "path/to/zip/file"; ZipFile zip = new ZipFile(zipFile); ``` 3. 创建 ZipParameters 对象,该对象包含了压缩所需的参数,例如压缩算法、压缩级别、加密等级等。这里我们可以使用默认参数: ```java ZipParameters parameters = new ZipParameters(); ``` 4. 调用 addFile 方法将文件添加到压缩文件中: ```java zip.addFile(new File(sourceFile), parameters); ``` 5. 关闭 ZipFile 对象: ```java zip.close(); ``` 完整的代码示例: ```java import net.lingala.zip4j.exception.ZipException; import net.lingala.zip4j.core.ZipFile; import net.lingala.zip4j.model.ZipParameters; import java.io.File; public class ZipSingleFile { public static void main(String[] args) { String sourceFile = "path/to/source/file"; String zipFile = "path/to/zip/file"; try { ZipFile zip = new ZipFile(zipFile); ZipParameters parameters = new ZipParameters(); zip.addFile(new File(sourceFile), parameters); zip.close(); System.out.println("File successfully compressed!"); } catch (ZipException e) { e.printStackTrace(); } } } ``` 注意:Zip4j 不支持对文件夹进行压缩,如果需要压缩文件夹,需要先将文件夹下的所有文件递归地添加到压缩文件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值