2013-08-05 54 views
0

当使用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,是有什么办法可以读取使用公共嵌入压缩归档文件的字节?

回答

1

你重新做一些奇怪的stuff it seems? For each archieve entry while your reading your archieve你递归地调用你的读取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

+0

说有没有办法猜测到给定的文件使用的归档,而不是为每个档案库创建对象? –

+0

这一切都取决于你想要做什么。你想只阅读一个特定的文件,如果是的话,你知道哪一个?可以使用ArchiveEntry对象访问archieve中的所有文件。 – Filip

+0

我正在阅读可包含任何类型档案的整个文件目录。我想打开每个档案并用它的字节做一些事情(在另一个对象中)。 –