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的InitializingBean接口解析

    Spring的InitializingBean接口解析

    这篇文章主要介绍了Spring的InitializingBean接口解析,InitializingBean是spring为bean的初始化提供了一种新的方式,里面只有一个方法afterPropertiesSet,作用就是实现这个接口或者实现了继承InitializingBean的方法的bean都要执行这个方法,需要的朋友可以参考下
    2024-02-02
  • 基于注解的springboot+mybatis的多数据源组件的实现代码

    基于注解的springboot+mybatis的多数据源组件的实现代码

    这篇文章主要介绍了基于注解的springboot+mybatis的多数据源组件的实现,会使用到多个数据源,文中通过代码讲解的非常详细,需要的朋友可以参考下
    2021-04-04
  • Java 多线程实例详解(二)

    Java 多线程实例详解(二)

    本文主要介绍Java 多线程的资料整理,这里整理了详细资料及相关示例代码,有兴趣的小伙伴可以参考下
    2016-09-09
  • 关于Java中阻塞队列BlockingQueue的详解

    关于Java中阻塞队列BlockingQueue的详解

    这篇文章主要介绍了关于Java中阻塞队列BlockingQueue的详解,BlockingQueue是为了解决多线程中数据高效安全传输而提出的,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞,需要的朋友可以参考下
    2023-05-05
  • Spring Boot Admin的使用详解(Actuator监控接口)

    Spring Boot Admin的使用详解(Actuator监控接口)

    这篇文章主要介绍了Spring Boot Admin的使用详解(Actuator监控接口),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • Java中IO流解析及代码实例

    Java中IO流解析及代码实例

    下面小编就为大家带来一篇关于Java中的IO流总结(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-07-07
  • Java中调用DLL动态库的操作方法

    Java中调用DLL动态库的操作方法

    在Java编程中,有时我们需要调用本地代码库,特别是Windows平台上的DLL(动态链接库),本文中,我们将详细讨论如何在Java中加载和调用DLL动态库,并通过具体示例来展示这个过程,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • 探讨Java语言中那些修饰符

    探讨Java语言中那些修饰符

    在java中常见的修饰符有:abstract(抽象的)、static(静态的)、public(公共的)、protected(受保护的)、private(私有的)、synchronized(同步的)、native(本地的)、transient(暂时的)、volatile(易失的)、final(不可改变的)。对java语言修饰符感兴趣的朋友一起看看吧
    2016-11-11
  • Java判断一个字符串是不是一个数字的解决思路

    Java判断一个字符串是不是一个数字的解决思路

    这篇文章主要给大家介绍了关于Java判断一个字符串是不是一个数字的解决思路,判断一个字符串是否为数字是Java开发中很常见的业务需求,实现这个判断有很多种方式,需要的朋友可以参考下
    2023-08-08
  • Java读取或删除Excel文件文档属性的解决方案

    Java读取或删除Excel文件文档属性的解决方案

    Excel文件不仅仅是数据表格,它们还承载着重要的元数据,即文档属性,这些属性在文件管理、信息溯源和数据合规性方面扮演着关键角色,本文将深入探讨如何利用功能强大的Spire.XLS for Java库,轻松实现Excel文档属性的读写与删除操作,需要的朋友可以参考下
    2025-12-12

最新评论