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);
    }
}
相关推荐
希忘auto4 分钟前
详解MySQL安装
java·mysql
娅娅梨6 分钟前
C++ 错题本--not found for architecture x86_64 问题
开发语言·c++
汤米粥12 分钟前
小皮PHP连接数据库提示could not find driver
开发语言·php
冰淇淋烤布蕾15 分钟前
EasyExcel使用
java·开发语言·excel
拾荒的小海螺21 分钟前
JAVA:探索 EasyExcel 的技术指南
java·开发语言
Jakarta EE38 分钟前
正确使用primefaces的process和update
java·primefaces·jakarta ee
马剑威(威哥爱编程)1 小时前
哇喔!20种单例模式的实现与变异总结
java·开发语言·单例模式
白-胖-子1 小时前
【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-统计数字
开发语言·c++·算法·蓝桥杯·等考·13级
好睡凯1 小时前
c++写一个死锁并且自己解锁
开发语言·c++·算法
java—大象1 小时前
基于java+springboot+layui的流浪动物交流信息平台设计实现
java·开发语言·spring boot·layui·课程设计