【问题标题】:Is this inputstream being closed?这个输入流被关闭了吗?
【发布时间】:2013-08-05 18:56:02
【问题描述】:

我在使用 org.apache.commons.compress 读取嵌入式存档文件时遇到了一些非常奇怪的错误,我怀疑是我的经验不足困扰着我。

在运行我的代码时,我收到了各种截断的 zip 文件错误(以及其他截断的文件错误)。我怀疑这是我使用ArchiveInputStream

private final void handleArchive(String fileName, ArchiveInputStream ais) {
   ArchiveEntry archiveEntry = null;

   try {
      while((archiveEntry = ais.getNextEntry()) != null) {

         byte[] buffer = new byte[1024];

         while(ais.read(buffer) != -1) {
            handleFile(fileName + "/" + archiveEntry.getName(), archiveEntry.getSize(), new ByteArrayInputStream(buffer));
   } catch(IOException ioe) {
      ioe.printStackTrace();
   }
}

当我这样做archiveEntry = ais.getNextEntry() 时,这是否有效地关闭了我的ais,有没有办法使用公共压缩读取嵌入式存档文件的字节?

【问题讨论】:

    标签: java bytearray inputstream apache-commons-compress


    【解决方案1】:

    你正在做一些奇怪的stuff it seems? For each archieve entry while your reading your archieve 你递归地调用你的 read archieve 方法,这导致在你的父代码仍在处理你以前的归档时打开下一个归档。

    在处理压缩文件中的任何新存档条目之前,您应该完全循环访问您的存档条目。类似的东西

    ArArchiveEntry entry = (ArArchiveEntry) arInput.getNextEntry();
    byte[] content = new byte[entry.getSize()];
    LOOP UNTIL entry.getSize() HAS BEEN READ {
        arInput.read(content, offset, content.length - offset);
    }
    

    the examples on the apache site中所述

    【讨论】:

    • 有没有办法猜测给定文件使用哪个归档器,而不是为每个归档器创建对象?
    • 这一切都取决于你想做什么。您是否只想读取档案中的 1 个特定文件,如果是,您知道是哪一个吗?归档中的所有文件都可以使用 ArchiveEntry 对象访问。
    • 我正在阅读可以包含任何类型存档的整个文件目录。我想打开每个档案并用它的字节做一些事情(在另一个对象中)。
    • 那么你必须遍历所有的成就条目,阅读每个条目的整个字节流,然后再按照我在帖子中的建议继续下一个条目。档案条目的类型由文件名的扩展名定义。看看我发布的示例链接。那里有各种档案及其相应的实现类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 2020-01-22
    • 1970-01-01
    • 2011-09-04
    相关资源
    最近更新 更多