此输入流是否已关闭?

时间:2013-08-05 18:56:02

标签: java bytearray inputstream apache-commons-compress

使用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,有没有办法使用commons compress读取嵌入式存档文件的字节?

1 个答案:

答案 0 :(得分:1)

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

在压缩文件中处理任何新的archieve条目之前,您应该完全遍历您的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

中所述