java 将目录下文件打包成zip,并将zip文件放置到当前目录下工具类

java 将目录下文件打包成zip,并将zip文件放置到当前目录下工具类

java 复制代码
import java.io.*;
import java.util.LinkedList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * @author dume
 * @ClassName ZIPUtils
 * @description: 文件夹压缩成zip
 * @date 2024年07月12日
 * @version: 1.0
 */
public class ZIPUtils {
    /**
     * 创建zip压缩包
     * @param zipFilePath 压缩包文件路径
     * @param resourcePath 进行压缩的文件路径
     */
    public static File createZip(String zipFilePath, String resourcePath) throws IOException {
        //首先获取文件路径下的所有文件的list(包含子文件夹下的)
        List<File> files = getFileList(new File(resourcePath));

        //判断压缩包路径中有无同名压缩包,有则删除
        File zip = new File(zipFilePath);
        if (zip.exists()) {
            zip.delete();
        }

        //创建压缩包文件
        zip.createNewFile();

        FileOutputStream output = new FileOutputStream(zip);
        ZipOutputStream zipOut = new ZipOutputStream(output);
        //遍历文件List
        for (File file : files) {
            FileInputStream input = new FileInputStream(file);
            BufferedInputStream bufferedInputStream = new BufferedInputStream(input);
            //从file的路径中截取掉resourcePath,只留下相对的地址,是为了让生成的压缩包的文件层级与resourcePath内一致
            ZipEntry zipEntry = new ZipEntry(file.getPath().substring(resourcePath.length()));
            zipOut.putNextEntry(zipEntry);
            int num;
            byte[] buffer = new byte[512];
            while ((num = bufferedInputStream.read(buffer)) != -1) {
                zipOut.write(buffer, 0, num);
            }
            bufferedInputStream.close();
            input.close();
        }
        zipOut.close();
        output.close();
        return zip;
    }

    /**
     * 获取文件夹下的所有文件列表
     * @param file 文件夹的File
     */
    public static List<File> getFileList(File file){
        List<File> fileList = new LinkedList<>();
        File[] files = file.listFiles();
        for (File f : files) {
            //如果是目录,则递归调用本方法
            if (f.isDirectory()){
                fileList.addAll(getFileList(f));
            } else {
                fileList.add(f);
            }
        }

        return fileList;
    }

    public static void main(String[] args) throws Exception {
        //这里必须使用File.separator来分隔,以避免不同操作系统因默认分隔符不同而报错
        String zipPath = "C:" + File.separator + "test" + File.separator + "1.zip";
        String filePath = "C:" + File.separator + "test" + File.separator;
        createZip(zipPath, filePath);
    }
}
相关推荐
爱奥尼欧几秒前
【Git】远程分支删了本地还在、两个分支历史不相干?两招故障排解
开发语言·git
Java后端的Ai之路3 分钟前
Git冲突完整排查与实战:本地修改覆盖报错到成功推送全流程复盘
开发语言·人工智能·git·python·pop
ruleslol5 分钟前
System Prompt(系统提示词) 的用法
java·ai
码事漫谈5 分钟前
全球最聪明的几个人,本周突然一起说“别卷了”
后端
skywalk81636 分钟前
AI 中台记录:使用码道基于deepseek harness制作AI数字中台9.14日
开发语言·人工智能·ai中台
CVer儿7 分钟前
vs2022配置qt
开发语言·qt
IT_陈寒8 分钟前
React重渲染这坑,我跳进去又爬出来了
前端·人工智能·后端
user_admin_god9 分钟前
第 03 篇:Java HttpClient 手写第一个 Chat 请求
java·人工智能·spring boot·语言模型
西峰u17 分钟前
Java多线程从入门到线程安全
java·开发语言·jvm