Java Zip工具类

发布时间:『 2020-07-12 18:50:46 』  博客类别:Java  阅读(-1)

由于项目需要打包下载素材,所以需要用到打包压缩功能。谷歌了下没有找到自己很想要的的工具类,干脆自己研究下写一个。

ZipUtils.java

package cn.happyjava.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * 压缩工具类
 *
 * @author Loger
 */
public class ZipUtils {

    /**
     * 压缩目录
     *
     * @param sourceDir   需要压缩的目录,如果目录为空则输出一个空的压缩文件
     * @param targetFile  目标文件(zip)
     * @param overlayFile 如果文件存在,是否覆盖
     * @throws IOException exception
     */
    public static void zipDir(String sourceDir, String targetFile, boolean overlayFile) throws IOException {
        if (sourceDir == null || targetFile == null) {
            throw new NullPointerException();
        }
        File dir = new File(sourceDir);
        if (!dir.exists()) {
            throw new IllegalArgumentException(String.format("sourceDir[%s] not exist", sourceDir));
        }
        if (!dir.isDirectory()) {
            throw new IllegalArgumentException(String.format("sourceDir[%s] is not a directory", sourceDir));
        }
        if (!overlayFile && new File(targetFile).exists()) {
            throw new IllegalArgumentException(String.format("targetFile[%s] is exist,zip fail", targetFile));
        }
        File[] files = dir.listFiles();
        zip(targetFile, files);
    }

    /**
     * 压缩文件(可以多个)
     *
     * @param targetFile  目标文件
     * @param overlayFile 是否覆盖目标文件
     * @param files       要压缩的File,如果传入null则会生成一个空的压缩文件
     * @throws IOException exception
     */
    public static void zipFile(String targetFile, boolean overlayFile, File... files) throws IOException {
        if (targetFile == null) {
            throw new NullPointerException();
        }
        if (!overlayFile && new File(targetFile).exists()) {
            throw new IllegalArgumentException(String.format("targetFile[%s] is exist,zip fail", targetFile));
        }
        zip(targetFile, files);
    }

    private static void zip(String targetFile, File[] files) throws IOException {
        if (files == null) {
            files = new File[0];
        }
        try (FileOutputStream fileOutputStream = new FileOutputStream(targetFile);
             ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream)) {
            for (File file : files) {
                if (!file.exists()) {
                    continue;
                }
                try (FileInputStream inputStream = new FileInputStream(file)) {
                    ZipEntry zipEntry = new ZipEntry(file.getName());
                    zipOutputStream.putNextEntry(zipEntry);
                    byte[] bytes = new byte[1024];
                    int length;
                    while ((length = inputStream.read(bytes)) >= 0) {
                        zipOutputStream.write(bytes, 0, length);
                    }
                }

            }
        }
    }

}


上一篇:好友抖音面试真题:二叉树的序列化与反序列化(解法二)

下一篇:烦人的markdown,打包之后高亮效果没了


Happyjava的博客

何以解忧?唯有定投!可以是定期投资,也可以是定期学习,不冲突!

个人QQ号: 「1015030682」

联系邮箱: 「happyjava@foxmail.com」

备案号:浙ICP备17032647号-3