Java从ZipInputStream条目创建InputStream

2024-04-13

我想编写一个从单个 InputStream 读取 ZIP 内的多个 XML 文件的方法。

该方法将打开一个 ZipInputStream,并在每个 xml 文件上获取相应的 InputStream,并将其提供给我的 XML 解析器。这是该方法的框架:

private void readZip(InputStream is) throws IOException {

    ZipInputStream zis = new ZipInputStream(is);
    ZipEntry entry = zis.getNextEntry();

    while (entry != null) {

        if (entry.getName().endsWith(".xml")) {

            // READ THE STREAM
        }
        entry = zis.getNextEntry();
    }
}

有问题的部分是“// READ THE STREAM”。我有一个可行的解决方案,其中包括创建一个 ByteArrayInputStream,并将其提供给我的解析器。但它使用缓冲区,对于大文件,我会收到 OutOfMemoryError 错误。这是代码,如果有人仍然感兴趣的话:

int count;
byte buffer[] = new byte[2048];
ByteArrayOutputStream out = new ByteArrayOutputStream();
while ((count = zis.read(buffer)) != -1) { out.write(buffer, 0, count); }       
InputStream is = new ByteArrayInputStream(out.toByteArray());

理想的解决方案是向解析器提供原始的 ZipInputStream。它应该可以工作,因为如果我只是用扫描仪打印条目内容它就可以工作:

Scanner sc = new Scanner(zis);
while (sc.hasNextLine())
{
    System.out.println(sc.nextLine());
}

但是...我当前使用的解析器(jdom2,但我也尝试使用 javax.xml.parsers.DocumentBuilderFactory)在解析数据后关闭流:/ 。所以我无法获取下一个条目并继续。

所以最后的问题是:

  • 有人知道不关闭其流的 DOM 解析器吗?
  • 还有另一种方法可以从 ZipEntry 获得 InputStream 吗?

Thanks.


Tim 解决方案的一个小改进:必须在 close() 之前调用 allowedToBeClosed() 的问题是,它使得在处理异常时正确关闭 ZipInputStream 变得很棘手,并且会破坏 Java 7 的 try-with-resources 语句。

我建议创建一个包装类,如下所示:

public class UncloseableInputStream extends InputStream {
  private final InputStream input;

  public UncloseableInputStream(InputStream input) {
    this.input = input;
  }

  @Override
  public void close() throws IOException {} // do not close the wrapped stream

  @Override
  public int read() throws IOException {
    return input.read();
  }

  // delegate all other InputStream methods as with read above
}

然后可以安全地使用如下:

try (ZipInputStream zipIn = new ZipInputStream(...))
{
  DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
  ZipEntry entry;
  while (null != (entry = zipIn.getNextEntry()))
  {
    if ("file.xml".equals(entry.getName())
    {
      Document doc = db.parse(new UncloseableInputStream(zipIn));
    }
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java从ZipInputStream条目创建InputStream 的相关文章

  • 使用 GWT 读取非常大的本地 XML 文件

    我正在使用 GWT 构建我的第一个 Java 应用程序 它必须从一个非常大的 XML 文件中读取数据 当我尝试发送对文件中信息的请求时遇到问题 并且我不太确定它是否与文件的大小或我的语义有关 在我的程序中 我有以下内容 static fin
  • GWT - 如何组织项目以拥有多个网页以及它们之间的导航

    我是 GET 的新手 顺便说一句 它给我留下了深刻的印象 并且发现它对于像我这样熟悉 C NET 桌面技术并愿意编写 Web 应用程序的人来说非常有吸引力 我根据 GWT Eclipse 向导生成的示例启动了自己的项目 该项目生成带有面板的
  • Kotlin 未解决的参考:CLI 上 gradle 的 println

    放一个printlnkotlin 函数返回之前的语句会崩溃 堆栈跟踪 thufir dur NetBeansProjects kotlin thufir dur NetBeansProjects kotlin gradle clean bu
  • 如何根据运行的 jar 的结果让我的 ant 任务通过或失败?

    我正在运行 CrossCheck 无浏览器 js 单元测试 作为 ant 脚本的一部分 如果 CrossCheck 测试失败 我希望 ant 报告失败 这是 build xml 中的相关部分
  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • 套接字的读写如何同步?

    我们创建一个套接字 在套接字的一侧有一个 服务器 在另一侧有一个 客户端 服务器和客户端都可以向套接字写入和读取 这是我的理解 我不明白以下事情 如果服务器从套接字读取数据 它在套接字中是否只看到客户端写入套接字的内容 我的意思是 如果服务
  • 生成的序列以 1 开头,而不是注释中设置的 1000

    我想请求一些有关 Hibernate 创建的数据库序列的帮助 我有这个注释 下面的代码 在我的实体类中 以便为合作伙伴表提供单独的序列 我希望序列以 1000 开头 因为我在部署期间使用 import sql 将测试数据插入数据库 并且我希
  • 在另一个模块中使用自定义 gradle 插件模块

    我正在开发一个自定义插件 我希望能够在稍后阶段将其部署到存储库 因此我为其创建了一个独立的模块 在对其进行任何正式的 TDD 之前 我想手动进行某些探索性测试 因此 我创建了一个使用给定插件的演示模块 到目前为止 我发现执行此操作的唯一方法
  • Java:如何为山区时间创建 TimeZone 对象?

    必须不禁用夏令时 嗯 在这个清单 http en wikipedia org wiki List of tz database time zones在 zoneinfo 时区名称中 有很多声称是 山地时间 找到最适合您想要的那个 然后使用它
  • 如何在 Spring 属性中进行算术运算?

  • GWT 2.3 开发模式 - 托管模式 JSP 编译似乎不使用 java 1.5 兼容性

    无法编译 JSP 类 生成的 servlet 错误 DefaultMessage 上次更新 0 日期 中 0 时间 HH mm ss z 语法 错误 注释仅在源级别为 1 5 时可用 在尝试以开发模式在 Web 浏览器中打开我的 gwt 模
  • 使用 Mockito 模拟某些方法,但不模拟其他方法

    有没有办法使用 Mockito 模拟类中的某些方法 而不模拟其他方法 例如 在这个 诚然是人为的 Stock我想嘲笑的班级getPrice and getQuantity 返回值 如下面的测试片段所示 但我想要getValue 执行乘法 如
  • java库维护数据库结构

    我的应用程序一直在开发 所以偶尔 当版本升级时 需要创建 更改 删除一些表 修改一些数据等 通常需要执行一些sql代码 是否有一个 Java 库可用于使我的数据库结构保持最新 通过分析类似 db structure version 信息并执
  • “无法实例化活动”错误

    我的一个 Android 应用程序拥有大约 100 000 个用户 每周大约 10 次 我会通过 Google 的市场工具向我报告以下异常情况 java lang RuntimeException Unable to instantiate
  • OpenCSV:将嵌套 Bean 映射到 CSV 文件

    我正在尝试将 bean 映射到 CSV 文件 但问题是我的 bean 具有其他嵌套 bean 作为属性 所发生的情况是 OpenCSV 遍历属性找到一个 bean 然后进入其中并映射该 bean 内的所有数据 如果找到另一个 bean 它就
  • Java中HashMap和ArrayList的区别?

    在爪哇 ArrayList and HashMap被用作集合 但我不明白我们应该在哪些情况下使用ArrayList以及使用时间HashMap 他们两者之间的主要区别是什么 您具体询问的是 ArrayList 和 HashMap 但我认为要完
  • 如何使用play框架上传多个文件?

    我在用play framework 2 1 2 使用java我正在创建视图来上传多个文件 我的代码在这里 form action routes upload up enctype gt multipart form data
  • 在浏览器刷新中刷新检票面板

    我正在开发一个付费角色系统 一旦用户刷新浏览器 我就需要刷新该页面中可用的统计信息 统计信息应该从数据库中获取并显示 但现在它不能正常工作 因为在页面刷新中 java代码不会被调用 而是使用以前的数据加载缓存的页面 我尝试添加以下代码来修复
  • Java EE 目录结构

    我对以下教程有疑问 http www mkyong com jsf2 jsf 2 internationalization example http www mkyong com jsf2 jsf 2 internationalizatio
  • Spring表单ModelAttribute字段验证避免400 Bad Request错误

    我有一个ArticleFormModel包含正常发送的数据html form由 Spring 使用注入 ModelAttribute注释 即 RequestMapping value edit method RequestMethod PO

随机推荐

  • WCF 序列化列表对象为对象提供奇怪的名称

    以下是 WCF 服务中的方法签名 APIMessageList
  • 嵌套对象的打字稿字符串点表示法

    我有一个翻译字符串的嵌套对象 如下所示 viewName componentName title translated title 我使用接受点表示法字符串的翻译库来获取字符串 如下所示translate viewName componen
  • 返回 Git 中的 N 个提交以查找导致测试回归的提交

    是否有一个命令可以让我根据与当前提交的距离而不是使用提交 ID 来签出提交 Use Case 基本上我正在考虑设置一个 cron 作业类型脚本来在构建服务器上执行以下操作 拉取特定 git 分支的最新版本 git pull dev 构建它
  • IOS7 iPad 上智能应用横幅关闭后不出现

    简而言之 我的团队有一个移动网站和应用商店中的一个应用程序 我们添加了元标记来显示智能应用程序横幅 我看到了 一切都按预期进行 问题是 我刚刚关闭了横幅 现在它没有重新出现 我对 Ted com 智能应用横幅做了同样的事情 得到了相同的结果
  • 仅当单个 NaN 时才进行插值

    pandas 有没有办法只插入单个缺失的数据点 也就是说 如果有 2 个以上连续的 NaN 我想不理会它们 所以 举个例子 s pd Series 1 None 2 3 None None 4 5 d interpolate limit 1
  • 没有足够的配额来处理此命令 -WPF

    我正在开发 WPF 应用程序 我已经为此应用程序实现了错误处理并实现了错误邮件发送功能 因此 如果应用程序发生任何错误 管理员将收到错误消息 我的问题是我们总是收到以下错误消息 Error 没有足够的配额来处理此命令 MS Win32 Un
  • xml 格式变化时的 xpath 查询

    我有一系列变量类型 例如 abc1A abc1B abc3B xyz1A xyz2A xyz3C data1C data2A 以多种xml格式存储 area
  • 系统虚拟化:了解 IO 虚拟化和虚拟机管理程序的作用 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想对I O虚拟化有一个正确的理解 上下文是纯 全虚拟化 而不是半虚拟化 我的理解是 虚拟机管理程序虚拟化硬件并向每个沙盒应用程序提供虚拟资源 每个沙
  • 检测“位图中”的形状

    所以 在为下一场 ieextreme 比赛做准备时 我遇到了一些过去的问题 我发现一个真正困扰我的问题 因为我不知道该怎么做 我可能可以使用一些 300 行的暴力代码来实现它 但我我认为这不是在这样的比赛中应该做的事情 所以我需要你的帮助
  • 防止直接访问网站某些目录的最佳方法是什么?

    防止直接访问网站的某些目录的最佳方法是什么 1 创建并放置 htaccess我们要保护的每个目录中的文件并将下一行放入其中 Deny from all 2 创建并放置index php我们要保护的每个目录中的文件 并仅在其中放置下一行代码
  • 内部文件夹中的 ASP.NET Server.Mappath 问题

    我有一个 ASP NET 应用程序 在 APP Code 文件夹中我有一个类 我有以下代码来读取根文件夹中 XML 文件的内容 XmlDocument xmlSiteConfig new XmlDocument xmlSiteConfig
  • 了解皮尔逊相关系数

    作为生成计算的一部分皮尔逊相关系数 http devlicio us blogs billy mccafferty archive 2006 11 07 netflix memoirs using the pearson correlati
  • Rails 替换集合,而不是从 has_many 嵌套属性表单添加到集合中

    我有这些模型 为了便于阅读而简化 class Place lt ActiveRecord Base has many business hours dependent destroy accepts nested attributes fo
  • 在 JSF 中使用 JPA 实体。防止 LazyInitializationException 的最佳策略是什么?

    希望听取专家关于从 JSF UI 编辑 JPA 实体的最佳实践的意见 所以 关于这个问题 我要说几句话 想象一下我有持久化的对象MyEntity我获取它进行编辑 在 DAO 层我使用 return em find MyEntity clas
  • 如何使用文件实现循环缓冲区?

    我的应用程序 C 程序 打开同一文件的两个文件句柄 一个处于写入模式 一个处于读取模式 应用程序中的两个单独的线程读取和写入文件 这很好用 由于我的应用程序在 RAM 磁盘大小有限的嵌入式设备上运行 我想写FileHandle在达到最大大小
  • 如何按用途自动对类中的函数进行排序?

    a Robert C Martin 的 Clean Code 一书建议根据 降级规则 对函数进行排序 我们希望代码读起来像自上而下的叙述 我们想要每一个 函数之后是下一个抽象级别的函数 因此 我们可以读取该程序 下降一个抽象级别 我们阅读函
  • 交换 img src 或显示/隐藏多个图像是否更快?

    在网页上交换图像时使用的最佳做法是什么 更改图像源或只是在页面上显示 隐藏多个图像 为了平衡速度 你必须做出选择 有两个选择 更改图像源 这样 页面加载速度会更快 因为它只获取可见图像 但当您更改 src 属性时 显示新图像将花费更长的时间
  • 如何创建具有逐字环境的新 Beamer 环境?

    我正在创建一个 Beamer 演示文稿 其中包含大量 LaTeX 示例 并且必须在逐字环境中进行 我厌倦了打字 begin example begin verbatim Verbatim Text end verbatim end exam
  • 对于大输入,十进制扩展程序运行速度非常慢

    我正在编写一个程序来计算数字的小数扩展103993 33102我想根据用户输入的数字打印出所有尾随小数 它可以快速运行所有数量最多10 5但如果输入10 6编程大约需要 5 分钟才能打印出答案 我怎样才能加快速度 我尝试了两种不同的方法 一
  • Java从ZipInputStream条目创建InputStream

    我想编写一个从单个 InputStream 读取 ZIP 内的多个 XML 文件的方法 该方法将打开一个 ZipInputStream 并在每个 xml 文件上获取相应的 InputStream 并将其提供给我的 XML 解析器 这是该方法