使用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读取嵌入式存档文件的字节吗?

最佳答案

您正在做一些奇怪的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中所述

关于java - 此输入流是否关闭?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18065623/

10-11 18:03