2013-08-05 56 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

我正在閱讀可包含任何類型檔案的整個文件目錄。我想打開每個檔案並用它的字節做一些事情(在另一個對象中)。 –