Java 解压缩实用程序的性能不佳

2023-12-22

我注意到,与使用 WinZip 等本机工具相比,Java 中的解压缩工具非常慢。

有没有更高效的 Java 第三方库? 开源是首选。

Edit

以下是使用 Java 内置解决方案与 7zip 的速度比较。 我在原来的解决方案中添加了缓冲输入/输出流(谢谢吉姆,这确实产生了很大的影响)。

压缩文件大小:800K Java 解决方案:2.7 秒 7Zip 解决方案:204 毫秒

下面是使用内置Java解压修改后的代码:

/** Unpacks the give zip file using the built in Java facilities for unzip. */
@SuppressWarnings("unchecked")
public final static void unpack(File zipFile, File rootDir) throws IOException
{
  ZipFile zip = new ZipFile(zipFile);
  Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zip.entries();
  while(entries.hasMoreElements()) {
    ZipEntry entry = entries.nextElement();
    java.io.File f = new java.io.File(rootDir, entry.getName());
    if (entry.isDirectory()) { // if its a directory, create it
      continue;
    }

    if (!f.exists()) {
      f.getParentFile().mkdirs();
      f.createNewFile();
    }

    BufferedInputStream bis = new BufferedInputStream(zip.getInputStream(entry)); // get the input stream
    BufferedOutputStream bos = new BufferedOutputStream(new java.io.FileOutputStream(f));
    while (bis.available() > 0) {  // write contents of 'is' to 'fos'
      bos.write(bis.read());
    }
    bos.close();
    bis.close();
  }
}

问题不在于解压缩,而在于将解压缩的数据写回磁盘的低效方式。我的基准测试表明使用

    InputStream is = zip.getInputStream(entry); // get the input stream
    OutputStream os = new java.io.FileOutputStream(f);
    byte[] buf = new byte[4096];
    int r;
    while ((r = is.read(buf)) != -1) {
      os.write(buf, 0, r);
    }
    os.close();
    is.close();

相反,该方法的执行时间减少了 5 倍(6 MB zip 文件从 5 秒减少到 1 秒)。

可能的罪魁祸首是你使用bis.available()。除了不正确(available 返回字节数,直到对 read 的调用会阻塞,而不是直到流结束),这绕过了 BufferedInputStream 提供的缓冲,需要对复制到输出文件中的每个字节进行本机系统调用。

请注意,如果您像上面那样使用批量读取和写入方法,则不需要包装在 BufferedStream 中,并且关闭资源的代码不是异常安全的(如果读取或写入因任何原因失败,也不是异常安全的)。is nor os将被关闭)。最后,如果类路径中有 IOUtils,我建议使用它们经过充分测试的IOUtils.copy http://commons.apache.org/io/api-1.4/org/apache/commons/io/IOUtils.html#copy%28java.io.InputStream,%20java.io.OutputStream%29而不是自己滚动。

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

Java 解压缩实用程序的性能不佳 的相关文章

  • 为什么春季测试失败,不起作用@MockBean

    我尝试为一个简单的 spring boot 控制器创建我的第一个测试 但我得到Handler Type null 在浏览器中代码可以工作 但测试失败 我的应用程序使用 spring security 请帮助我解决问题并理解我的错误 谢谢 这
  • 如何创建约束输入流以仅读取文件的一部分?

    我想创建一个仅限于文件中一定范围的字节的输入流 例如从位置 0 到 100 的字节 这样 一旦到达第 100 个字节 客户端代码就应该看到 EOF The read 的方法InputStream一次读取一个字节 你可以写一个子类InputS
  • JMenuItem:如何设置具有3个键的加速器?

    请看下面的代码 import java awt import java awt event import javax swing public class MenuActions extends JFrame private JMenuBa
  • 转置矩阵存储在一维数组中,无需使用额外的内存[重复]

    这个问题在这里已经有答案了 可能的重复 矩阵的就地转置 https stackoverflow com questions 9227747 in place transposition of a matrix 最近参加了技术笔试 通过以下问
  • struts2应用程序未运行

    我是 Maven 和 struts2 的新手 当我尝试运行我的程序时出现以下错误 严重 调度程序初始化失败 无法加载配置 操作 文件 E workspace metadata plugins org eclipse wst server c
  • 如何使用 DirectoryStream.Filter 过滤隐藏文件

    我正在尝试使用 NIO 类过滤隐藏文件 当我在 Windows 10 上运行随附的代码时 我得到以下输出 Files c Documents and Settings c PerfLogs c Program Files c Program
  • 在 IntelliJ IDEA 中编辑并继续?

    使用 IntelliJ IDEA 社区版进行调试时是否可以编辑一些代码 我在选项中找不到这个功能 是的 这就是所谓的 热插拔 您可以在调试过程中编译修改后的代码 并且类文件将被替换 直到您停止调试 确保在调试器设置中启用 HotSwap 选
  • 克隆在幕后是如何工作的?

    克隆不会调用对象构造函数来创建对象的副本 那么clone使用什么算法呢 我正在寻找本机方法克隆的实现细节 任何指示将不胜感激 请注意 我知道克隆的缺点 protected native Object clone 我不太清楚 我需要查看本机代
  • Jenkins 中未找到 Maven

    我正在 Jenkins 中运行我的 Maven Spring 项目 只是第一次测试它 使用 shell 脚本选项 mvn spring boot run 我收到构建错误 Users Shared Jenkins tmp jenkins808
  • 如何使用我的 Apple 开发者 ID 签署 .jar 文件

    我有一个java可执行文件jar我需要使用我的 Apple 开发者 ID 进行签名的文件 我不打算通过应用程序商店分发它 我将通过我的网站直接向客户分发该应用程序 我不打算绕过 Gatekeeper Signing the app和我的de
  • 查看tomcat服务器的连接数

    我在 Tomcat Server 5 5 17 上部署了一个 Java Java EE Web 应用程序 我想知道连接到服务器的客户端数量 我们怎样才能找到它呢 最可靠的方法是搜索ip addr of srv port in netstat
  • Android Edittext Onclick Datepickerdialog 棒棒糖中出现错误

    我正在使用日期选择器对话框 它在 kitkat 上运行正常 但是当我在棒棒糖上运行应用程序时 当我单击编辑文本时 它会打开一个日期选择器对话框 但当我选择日期时 它会不幸地给出停止错误 以下是 edittext 上日期选择器的代码 priv
  • 全屏 Swing 组件无法在 Mac OS X Mountain Lion 上的 Java 7 上接收键盘输入

    12 21 更新 7u10 最近发布 确认 问题仍然存在 值得庆幸的是 解决方法仍然有效 11 7 更新 我们有一个解决方法 来自 Oracle 的 Leonid Romanov 在 openjdk java net 邮件列表上提供了一些关
  • 使用 jsch 将远程服务器中的目录移动到同一远程服务器中的另一个位置

    我正在使用 JSCH API 通过 sftp 连接到远程服务器 我需要将远程服务器中的目录从位置 A 移动到位置 B 看起来像方法channelsftp put src dest 只允许移动文件而不移动目录 有人可以解释一下我该怎么做吗 您
  • Spring MVC @RequestBody 不适用于 jquery ajax?

    这是我的ajax请求 var dataModel name1 value1 name2 value2 ajax url testURL type POST async false contentType application json d
  • 纹理映射和光照顶点着色器错误 Java OpenGL

    我正在尝试将纹理映射到 3D 立方体并尝试编写着色器以使其具有照明和纹理 我尝试过只编写纹理着色器并且它有效 我还尝试过仅将 3D 值设置为红色的照明着色器 并且该照明着色器也可以工作 但当我尝试将两者结合起来时 我遇到了问题 我在下面提供
  • JarSplice 的命令行参数?

    罐子接头 http ninjacave com jarsplice允许将 jar 文件以及其他依赖项和库聚合到一个可执行 jar 文件中 但是 我的可执行 jar 需要两个命令行参数 当我调用 JarSplice jar 时 这两个参数似乎
  • 将 JVM 参数放入要在运行时获取的文件中

    我正在构建当前应用程序的 jar 它需要设置几个 JVM 参数 有没有办法在文件中而不是在命令行上设置这些 JVM 参数 我已经做了一些搜索 看起来我可以使用 java properties 文件做一些事情 可能通过设置 java args
  • JShell 如何查找变量或结果的类型

    如何在 JShell 中查找变量或表达式结果的类型 正在尝试 Java 中的按位运算符 jshell gt byte b 5 lt lt 1 Error incompatible types possible lossy conversio
  • 为什么 java.io.File 没有 close 方法?

    While java io RandomAccessFile确实有一个close method java io File没有 这是为什么 文件在完成时会自动关闭吗 javadoc 的Fileclass 将该类描述为 文件和目录路径名的抽象表

随机推荐

  • 无法将源类型“List”转换为 IList

    这可能是一个非常简单的问题 但有些东西对我来说没有意义 给定这个类 public class Person ICloneable public object Clone Console WriteLine Hello world retur
  • 如何在 Symfony 路由中使用锚点?

    我在routing yml 文件中定义了一条路线 route name path dashboard messages id 然而 当我要求 Symfony 生成该路线时 我得到 dashboard 23messages 12345 如何跳
  • 在android中禁用短信通知[重复]

    这个问题在这里已经有答案了 可能的重复 我们可以在 Android 中的短信到达收件箱之前将其删除吗 https stackoverflow com questions 1741628 can we delete an sms in and
  • 在 C# 中将字符串转换为日期时间,格式为 yyyy-MM-dd HH:mm:ss

    我怎样才能转换这个2014 01 01 23 00 00 to DateTime我已经这样做了 Console WriteLine DateTime ParseExact 2014 01 01 23 00 00 yyyy MM dd HH
  • 将 onDelete 与原则 2 一起使用

    我无法让 onDelete 在 Doctrine2 中工作 使用 YAML 映射 我在我的尝试过这种关系Product class oneToOne category targetEntity Category onDelete CASCA
  • 如何使用 AzCopy 通过 cmd 在 Azure Web 应用服务中工作

    我面临一个问题 我正在使用 AzCopy 将文件复制到 Blob 存储 目前我使用虚拟机来托管我的应用程序 我能够将数据移动到 blob 现在我已将代码迁移到 Azure PaaS 即 azure 应用服务 现在的问题是我无法使用 cmd
  • 最新的omniauth-facebook gem 破解方案

    红宝石 2 6 3 gem rails gt 6 0 2 gt 6 0 2 1 我正在使用最新的omniauth facebook并一起设计 宝石文件 宝石 设计 gem omniauth facebook 启动服务器时出现此错误 vers
  • Docker MySQL连接DBeaver

    我刚刚完成了 YouTube 上的 Docker 教程 我能够为 PHP 和 MySQL 创建几个 Docker 容器 文件结构如下 gt Docker PHP MySQL gt DB Dockerfile gt src index php
  • 类型分类百科中应用语的构成规律

    我在读类型分类百科全书 https wiki haskell org Typeclassopedia我在应用程序部分遇到了麻烦 我想我 有点 已经弄清楚了 但我想看看我的理解是否正确 直到组合法出现之前 适用法则才有意义 我只是无法解析其右
  • 为什么主活动关闭时远程服务会被销毁?

    我编写了一个 android 程序 有一个 UI 主要活动 并且它启动一个服务 该服务及时回调 UI 活动以更新视图 它工作正常 除了 如果活动关闭 使用 BACK 并再次启动 服务也将再次启动 服务播放音频文件 因此有两个重叠的声音 我使
  • 链接到当前页面中的元素[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我创建了一个 HTML 页面 其中包
  • 如何创建多表检查约束?

    请想象一下这个小数据库 Diagram 删除了无效的 ImageShack 链接 志愿者数据库图 Tables Volunteer Event Shift EventVolunteer Id Id Id EventId Name Name
  • 获取 PHP DOM 中节点的文本

    如何使用 PHP DOM 从此标记中提取字符串 text div span notthis span text div div gt nodeValue包括 notthis 您可以访问DOMText直接使用 XPath 的节点 xpath
  • 如何在多进程和多线程环境中生成随机唯一标识符?

    我提出的每个解决方案都不是线程安全的 def uuid cls db u hexlify os urandom 8 decode ascii db execute SELECT sid FROM sessions WHERE sid u i
  • primeng:把重点放在控制上

    抱歉这个菜鸟问题 使用 primeng 包时 将焦点设置在控件上的推荐方法是什么 使用传统输入控件时 我设置一个表单变量 variable 并使用 ViewChild 获取对它的引用 以便我可以访问其本机元素 this variable n
  • 如何在 MySQL 中的 instr() 中使用区分大小写?

    可能重复 如何在 MySQL 的 instr 中应用通配符 https stackoverflow com questions 1905119 how to apply wildcard in instr in mysql 可能的重复链接显
  • 按一列分组并显示另一列的所有结果

    大家好 我正在尝试解决这个问题 但找不到解决方案 我有 2 列 正在尝试按第一列进行选择和分组 并显示第二列中的所有记录 我的桌子是 RegNo Name C117 Mariya Mathew C117 Baino Baby C117 Ma
  • SqlLocalDb 中的 Service Broker 或 SqlDependency?

    Is SqlDependency支持于SqlLocalDb 如果是的话如何启用 回答您主题中有关 Service Broker 的问题 Service Broker 在 LocalDB 中应该可以正常工作 但只有本地队列可用 远程队列在任一
  • CSS Reset 与 * 通配符

    为什么我不能简单地重置 margin 0 padding 0 font size 100 代替 html body div span object iframe h1 h2 h3 h4 h5 h6 p blockquote pre abbr
  • Java 解压缩实用程序的性能不佳

    我注意到 与使用 WinZip 等本机工具相比 Java 中的解压缩工具非常慢 有没有更高效的 Java 第三方库 开源是首选 Edit 以下是使用 Java 内置解决方案与 7zip 的速度比较 我在原来的解决方案中添加了缓冲输入 输出流