java ZipFile如何将多级目录压缩

 更新时间:2024年08月26日 09:18:29   作者:爱穿衬衫的张某某  
这篇文章主要介绍了java ZipFile如何将多级目录压缩问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

java ZipFile将多级目录压缩

在 Java 中,可以使用 java.util.zip 包中的 ZipOutputStream 和 ZipEntry 类来压缩多级目录。

一个例子

展示如何递归地将一个目录及其所有子目录和文件压缩到一个 ZIP 文件中:

import java.io.*;
import java.nio.file.*;
import java.util.zip.*;

public class ZipDirectory {
    public static void main(String[] args) throws IOException {
        String sourceDirPath = "path/to/source/directory";
        String zipFilePath = "path/to/output.zip";

        try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFilePath))) {
            Path sourceDir = Paths.get(sourceDirPath);
            Files.walk(sourceDir)
                 .filter(path -> !Files.isDirectory(path))
                 .forEach(path -> {
                      ZipEntry zipEntry = new ZipEntry(sourceDir.relativize(path).toString());
                      try {
                          zipOut.putNextEntry(zipEntry);
                          Files.copy(path, zipOut);
                          zipOut.closeEntry();
                      } catch (IOException e) {
                          System.err.println("Failed to add file to ZIP: " + path);
                          e.printStackTrace();
                      }
                 });
        }
    }
}

这个程序将遍历指定目录(包括子目录)的所有文件,并将它们添加到 ZIP 文件中。

步骤解析

  • 使用 Files.walk 方法递归遍历源目录。
  • 对于每个非目录文件,创建一个相对路径的 ZipEntry。
  • 将文件内容复制到 ZipOutputStream。

请根据实际情况替换 sourceDirPath 和 zipFilePath。此外,请确保适当处理异常并关闭资源以避免资源泄漏。

Java多级目录导出文件压缩包

                //创建临时文件
                File zipFile = File.createTempFile("test", ".zip");
                Path temp = Files.createTempDirectory(null);
                String srcImgPath = temp.toString();
 
                for( 循环 ){
                     String outImgPath = srcImgPath + "/aa/bb/cc";
                     File outImgFile = new File(outImgPath);
                     //如果文件夹不存在则创建
                     if (!outImgFile.exists() && !outImgFile.isDirectory()) {
                            outImgFile.mkdirs();
                     }
                    FileOutputStream outImgStream = new FileOutputStream(outImgPath + "/" + name);
                    ImageIO.write(bufImg, imgSuffix, outImgStream);
                    outImgStream.flush();
                    outImgStream.close();
                }
 
                ZipUtil.zip(srcImgPath, zipFile.getAbsolutePath(), true);
 
                String header = request.getHeader("User-Agent").toUpperCase();
                String fileName = "附件信息" + System.currentTimeMillis() + ".zip";
                if (header.contains("MSIE") || header.contains("TRIDENT") || header.contains("EDGE")) {
                    fileName = URLEncoder.encode(fileName, "utf-8");
                    //IE下载文件名空格变+号问题
                    fileName = fileName.replace("+", "%20");
                } else {
                    fileName = new String(fileName.getBytes(), "ISO8859-1");
                }
                response.reset();
                response.setContentType("text/plain");
                response.setContentType("application/octet-stream; charset=utf-8");
                response.setHeader("Location", fileName);
                response.setHeader("Cache-Control", "max-age=0");
                response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
 
                FileInputStream fis = new FileInputStream(zipFile);
                BufferedInputStream buff = new BufferedInputStream(fis);
                BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
                byte[] car = new byte[1024];
                int l = 0;
                while (l < zipFile.length()) {
                    int j = buff.read(car, 0, 1024);
                    l += j;
                    out.write(car, 0, j);
                }
                // 关闭流
                fis.close();
                buff.close();
                out.close();
                // 删除临时文件
                zipFile.delete();
                FileUtil.deleteDir(srcImgPath);

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • spring中12种@Transactional的失效场景(小结)

    spring中12种@Transactional的失效场景(小结)

    日常我们进行业务开发时,基本上使用的都是声明式事务,即为使用@Transactional注解的方式,本文主要介绍了spring中12种@Transactional的失效场景,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 仿钉钉流程轻松实现JSON转BPMN完整实现过程示例

    仿钉钉流程轻松实现JSON转BPMN完整实现过程示例

    这篇文章主要为大家介绍了仿钉钉流程轻松实现JSON转BPMN完整实现过程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Java 虚拟机栈详解分析

    Java 虚拟机栈详解分析

    在线程创建时,JVM会为每个线程创建一个单独的栈空间。JVM的栈内存不需要是连续的。JVM在栈上会进行两个操作:压入和弹出栈帧。对于一个特定的线程来说,栈被称为运行时栈。这个线程调用的每个方法会被存储在响应的运行时栈里,包括了参数,局部变量,计算媒介和其他数据
    2021-11-11
  • Java中的Random()函数及两种构造方法

    Java中的Random()函数及两种构造方法

    Java中存在着两种Random函数分别是java.lang.Math.Random和java.util.Random,文中给大家介绍了random()的两种构造方法,感兴趣的朋友跟随小编一起看看吧
    2018-11-11
  • Spring注解@Transactional失效的场景分析

    Spring注解@Transactional失效的场景分析

    在使用Spring中事务注解@Transactional时会存在几种场景下该注解失效,即不能按照预期封装成一个事务操作,于是本文文将对该注解进行学习并对相关失效场景进行分析,需要的朋友可以参考下
    2023-07-07
  • java实现将字符串中首字母转换成大写,其它全部转换成小写的方法示例

    java实现将字符串中首字母转换成大写,其它全部转换成小写的方法示例

    这篇文章主要介绍了java实现将字符串中首字母转换成大写,其它全部转换成小写的方法,涉及java字符串遍历、转换、拼接等相关操作技巧,需要的朋友可以参考下
    2019-06-06
  • 一文带你了解Java中的SPI机制

    一文带你了解Java中的SPI机制

    SPI 全称是 Service Provider Interface,是一种 JDK 内置的动态加载实现扩展点的机制,本文主要为大家介绍了SPI机制的原理与使用,需要的可以参考一下
    2023-04-04
  • 如何基于mybatis框架查询数据库表数据并打印

    如何基于mybatis框架查询数据库表数据并打印

    这篇文章主要介绍了如何基于mybatis框架查询数据库表数据并打印,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Java服务假死后续之内存溢出的原因分析

    Java服务假死后续之内存溢出的原因分析

    这篇文章主要介绍了Java服务假死后续之内存溢出,本文给大家分享原因排查和故障解决方法,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • 解读easyexcel中的常用注解

    解读easyexcel中的常用注解

    这篇文章主要介绍了关于easyexcel中的常用注解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04

最新评论