如何在Java中压缩文件和文件夹?

2023-12-26

请看下面的代码。

public void startCompress(String path,String fileName,String outputLocation,int compressType,int filSize) throws Exception
    {        
        System.out.println("Input Location: "+path);
        System.out.println("Output Location: "+outputLocation);   

            System.out.println(compressType);
            byte[] bs=new byte[filSize];
            System.out.println(filSize);

            FileOutputStream fos=new FileOutputStream(outputLocation+"/test.zip");

            System.out.println(fos.toString());
            ZipOutputStream zos=new ZipOutputStream(fos);

            ZipEntry ze = new ZipEntry(fileName);

            zos.putNextEntry(ze);

            FileInputStream inputStream=new FileInputStream(path);

            int len;
            while((len=inputStream.read(bs))>0){
                zos.write(bs, 0, len);                
            }
            inputStream.close();
            zos.closeEntry();
            zos.close();

    }

在上面的代码中,我们使用以下命令压缩文件java.util.zip包裹。但我们有一个问题。也就是说,如果我们选择多个文件,则只有一个文件被压缩。如果我们选择一个文件夹,压缩就不起作用。

如何解决此问题以压缩文件、文件、文件夹、文件夹甚至嵌套文件夹? Java zip 包支持 .zip、.tar、.tarGz 和 tarZ。因此,解决方案不应仅限于 .zip 扩展名。


这是我使用新的 java.nio 包的解决方案。只需调用 zipDir 并为其提供目录路径即可。它将在同一位置创建一个 zip 文件,但名称为<directory>.zip.

private static Path buildPath(final Path root, final Path child) {
    if (root == null) {
        return child;
    } else {
        return Paths.get(root.toString(), child.toString());
    }
}

private static void addZipDir(final ZipOutputStream out, final Path root, final Path dir) throws IOException {
    try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
        for (Path child : stream) {
            Path entry = buildPath(root, child.getFileName());
            if (Files.isDirectory(child)) {
                addZipDir(out, entry, child);
            } else {
                out.putNextEntry(new ZipEntry(entry.toString()));
                Files.copy(child, out);
                out.closeEntry();
            }
        }
    }
}

public static void zipDir(final Path path) throws IOException {
    if (!Files.isDirectory(path)) {
        throw new IllegalArgumentException("Path must be a directory.");
    }

    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(path.toString() + ".zip"));

    try (ZipOutputStream out = new ZipOutputStream(bos)) {
        addZipDir(out, path.getFileName(), path);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Java中压缩文件和文件夹? 的相关文章

  • Java如何删除设置了IMMUTABLE位的文件

    正在开发一个 Java 8 项目 我从外部源复制文件 在这些源之一中 文件设置了不可变位标志 In OSX这是这样设置的 sudo chflags schg path to file In Linux chattr i path to fi
  • Maven 2 未运行 Junit 4 测试

    我在确保运行 Junit4 测试时遇到问题 同样的问题也被报告在https stackoverflow com questions 2021771 sort newest sort top https stackoverflow com q
  • Java 相当于 Perl 的 s/// 运算符?

    我有一些代码正在从 Perl 转换为 Java 它大量使用了正则表达式 包括s 操作员 我已经使用 Perl 很长时间了 但仍然习惯 Java 的做事方式 特别是 字符串似乎更难使用 有谁知道或有一个完全实现的Java函数s 这样它就可以处
  • 使用 Hibernate 和 Apache DBCP 的 MySQL 连接池问题

    看来我的应用程序有问题 当应用程序在启动后闲置很长时间 我不确定确切的时间 时 我会在日志中收到以下错误消息 我使用 Spring Hibernate MySQL 和 ApacheDBCP 进行连接池 ERROR org hibernate
  • 到底什么是哈希冲突

    HashMap 中的哈希冲突或哈希冲突并不是一个新主题 我遇到过几个博客和讨论板 以模糊且详细的方式解释如何产生哈希冲突或如何避免它 我最近在一次采访中遇到了这个问题 我有很多事情要解释 但我认为很难准确地给出正确的解释 抱歉 如果我的问题
  • 整数与 int 比较

    我是新来的java 我现在正在学习非原始整数类型java 我知道以下比较无效并引发编译错误 String str c Char chr c if str chr return true 上面的代码片段给了我 Test java lineNu
  • Spring Boot 多部分文件始终为 null

    我正在使用 Spring Boot version 1 4 0 RC1 和 Spring Boot Stormpath 1 0 2 我正在尝试使用分段文件上传 但控制器中的 MultipartFile 始终为空 当我使用 RequestPa
  • 为什么java(>=7版本)不支持运行没有main方法的程序? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 class WithoutMain static System out println Without main class Sy
  • 如何使用键盘上的“删除”按钮作为从 JTable 中删除行的快捷方式[重复]

    这个问题在这里已经有答案了 可能的重复 如何制作删除按钮来删除JTable中的行 https stackoverflow com questions 13236206 how to make delete button to delete
  • java.lang.ClassCastException: [B 无法转换为 java.lang.String

    我编写了一个带有字段 LoginId 和密码的实体类 我使用 AES ENCRYPT 加密密码并将其存储在数据库中 我只想检索已解密的密码 所以 我使用 AES DECRYPT 使用本机查询是在 OPen JPA 2 0 中 我写的查询是
  • iText7 将 SVG 添加到 PdfDocument 中以及可能出现的问题

    关于问题的答案 如何使用 iText7 将 SVG 添加到 PDF 这是一个链接点击这里 https stackoverflow com questions 50059456 how to add an svg to a pdf using
  • Visual Studio Code - Java 类路径不完整。只会报告语法错误

    在使用 python 获得了丰富的经验之后 我正在使用 java 迈出第一步 我正在运行的脚本是一个简单的 Java Swing Gui 它可以从命令行和 VS Code 中正常编译和运行 为了设置 java 调试环境 我使用 github
  • Wildfly 10.1 消耗所有核心

    我们最近将银行应用程序从 java 1 6 升级到 1 8 将 jboss 4 x 升级到 wildfly 10 1 我们观察到 java 消耗了机器上可用的所有核心 10 有人可以告诉是什么原因吗 通常情况下 jboss 4 x 的最大
  • 如何使用 VBScript 读取 .zip 文件的内容而不实际解压文件?

    我有一个以父目录开头的 zip 文件 我需要从文件中读取该目录 然后搜索我的硬盘以查看该目录名称是否已存在 如果存在 我会将其删除并替换为 zip 文件的内容 所有这些我都可以做 除了读取 zip 而不实际解压缩文件 zip 文件的大小可以
  • 使用 InputStream 通过 TCP 套接字接收多个图像

    每次我从相机捕获图像时 我试图将多个图像自动从我的 Android 手机一张一张地发送到服务器 PC 问题是read 函数仅在第一次时阻塞 因此 从技术上讲 只有一张图像被接收并完美显示 但在那之后当is read 回报 1 该功能不阻塞
  • 如何从Java中的连接获取查询字符串?

    我正在编写一个方法 尝试记录数据库调用 形成连接到它的连接 在查询之后 有很多地方调用方法 connect 来启动并调用 cleanUp 方法来结束 我不能并且不想修改每个地方 所以顺序是这样的 Connection con connect
  • Eclipse 在单独的窗口中打开代码

    我正在 eclipse 中编程 在两个显示器设置上运行 在其中一台显示器上 我只获得了项目资源管理器和编辑器作为自定义透视图 而在另一台显示器上 我获得了其他工具 例如控制台 调试 任务 变量 断点等 例如 当我单击任务视图中的任务时 这将
  • Java“非法访问操作”方法将被弃用? [复制]

    这个问题在这里已经有答案了 JDK 9 JVM 发出非法访问操作警告后 如果您使用一些非法访问 例如setAccessible 我的问题 Is setAccessible 以后会被封吗 此功能的官方参考 如果将被弃用 在哪里 我在任何地方都
  • 用 lambda 表达式替换匿名函数

    我在 Java 8 映射操作中传递一个函数 Intellij 告诉我它可以用 lambda 表达式替换 但我不知道如何在不创建中间对象结构的情况下做到这一点 这就是我所做的 List
  • 在没有 ODBC 的情况下从 Java 操作 Access 数据库

    我想从我的 Java 项目操作 Microsoft Access 数据库 accdb 或 mdb 文件 我不想使用 Microsoft 的 JDBC ODBC Bridge 和 Access ODBC 驱动程序 因为 JDBC ODBC 桥

随机推荐

  • 如何对多列上的数组进行排序?

    我有一个多维数组 主数组是一个数组 publicationID publication name ownderID owner name 我想做的是将数组排序owner name然后通过publication name 我知道在 JavaS
  • 从图像中剪切 x 像素

    为什么这会创建许多图像而不是两个 convert input image jpg crop 28x repage monet vertical d jpg 我想得到两张图像 距基础 28 像素和另一张图像 其中包含剩余的内容 convert
  • 检测 API 更改/演变 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想测量给定 Java 项目的 API 演变 特别是新 重命名的类 新方法 新弃用的方法等 是否有工具
  • Firebase Navigator 无法在 onMessageOpenedApp 上运行

    我阅读了 stackoverflow 上的所有主题 但没有一个对我有用 当您单击通知时 我正在尝试使用导航器 一切工作正常 但是当您单击它时 没有错误 也没有导航 通知就消失了 我能做些什么 我将分享代码 initState super i
  • 如何加载hive表中的多行列数据?具有换行符的列

    我在 Excel 文件中有一个列 不是最后一列 其中包含跨越几行的数据 列的某些单元格为空白 有些单元格具有单行条目 当保存为 CSV 文件或制表符分隔 txt 与 Excel 时 所有多行数据和少数单行条目都会在双引号中生成 所有空白字段
  • Shared_ptr 和weak_ptr 转换

    我正在尝试使用杂耍对象std shared ptr and std weak ptr 场景是这样的 我有类对象channel它派生自抽象类abstract channel 具有纯虚函数 我有一个容器channelContainer std
  • ModuleNotFoundError:没有名为“fastapi”的模块

    这是我的文件结构和requirements txt Getting ModuleNotFoundError 任何帮助将不胜感激 main py from fastapi import FastAPI from import models f
  • 将设置添加到设置

    我正在开发的应用程序在很大程度上是仅后台服务 但需要用户必须添加一些设置 有没有办法将应用程序与常见的设置应用程序 视图 活动集成 有没有办法整合 具有通用设置的应用程序 应用程序 视图 活动 只能通过修改固件 Android 不支持定义或
  • 重写discord.py |我的命令出错

    现在我 大部分 完成了我的审核命令 我正在尝试添加错误 我已经犯了 请指定成员 错误 但我无法设法让机器人在无效时说 此成员不存在 名称已输入 client command name kick brief Kicks user aliase
  • 如何在mysql服务器上存储文件

    我需要从 vb NET 表单将图像或 pdf 等文件发送到 mysql 数据库 我怎样才能做到这一点 有特定的列类型吗 我应该编写什么类型的 sql 查询来发送文件 您可以上传文件并将其保存在服务器中的文件夹中 并将文件的文件名或路径以及唯
  • Angular ng-bind-html 和其中的指令

    笨蛋链接 http plnkr co edit EZuKFBrE94bujWpcNat2 p preview 我有一个元素 我想将 html 绑定到它 div div 这样可行 现在 除了它之外 我还有一个绑定到绑定 html 的指令 sc
  • WPF:如何在具有延迟时间的单独线程中调用方法

    我有一个TextBox该用户可以在其中输入搜索词 它绑定到string Term我的财产view model 我想在内容更改时进行搜索查询 但我想在一个单独的线程中执行查询delay 例如当用户输入字母时 我想等待0 3秒 如果用户在这段时
  • UML 序列图的形式语言

    是否有一种形式语言可用于将 UML 序列图中存在的信息捕获为人类易于理解的文本格式 在我们这里 软件需求通常是用复杂的序列图来指定的 这些序列图很难审查 验证正确性并进行更改 另外 恕我直言 程序员更喜欢从需求的明确文本表示来实现 而不是从
  • 如何使用 VB.Net 获取弹出消息框中包含的控件的属性

    我正在研究一个VB Net项目的其中一部分是我在显示时捕获一个弹出消息框并以某种方式处理它 我的问题是我必须知道这个弹出窗口中包含哪些按钮 主要是它们的标题 这可能吗 有人可以告诉我如何做到这一点吗 如果有样品 我们将不胜感激 Thanks
  • 最好的 XNA 博客是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 Visual Studio 中,是否有键盘快捷键可以在代码编辑器窗口中显示数据提示(鼠标悬停时出现的浮动手表)?

    在 Visual Studio 中 DataTip 是当您将鼠标悬停在变量上时出现的浮动监视 它会显示其值 有没有办法通过键盘而不是鼠标来完成此操作 PS I now about the QuickWatch window Shift F9
  • 哪种哈希算法提供最长的输出?

    我很好奇 PHP 的 crypt 函数使用的哪种散列方法提供了最长的输出 而且 输出的长度是否是相对的 它们是否有可能是两个散列的冲突 See 这条评论 https www php net manual en function hash p
  • 如何查看 IntelliJ IDEA 用于编译我的代码的 javac 命令?

    当我在 IntelliJ IDEA 中编写 Java 代码并运行它时 IntelliJ 会编译 Java 文件 提取类文件 然后运行该类文件 如何查看 IntelliJ 运行的 javac 命令行 我询问它是为了了解 IntelliJ 是否
  • Flutter 运行命令错误:在分离视图上调用 FlutterView.send

    谁能告诉我为什么我的应用程序根本没有安装并以错误消息结束 天文台连接从未准备好 直到昨天 该应用程序都运行得很好 我昨天在命令提示符中将频道更改为 master 从那时起该应用程序就不再运行 我什至切换回 alpha 通道但仍然没有用 我附
  • 如何在Java中压缩文件和文件夹?

    请看下面的代码 public void startCompress String path String fileName String outputLocation int compressType int filSize throws