2009-10-01 100 views
3

我有一個zip文件,其中可以包含任何數量的zip文件(也遞歸)。我需要遍歷所有這些。ZipFile內的ZipFile

現在,我有一個函數,它將zipInputStream和zipFile作爲參數。問題是;如果我在另一個zip中得到一個zip,我將再次遞歸地調用這個函數。所以我不知道如何爲另一個zip文件中的zip文件創建zip文件對象。有人可以提出一種方法來做到這一點?你以前遇到過嗎?

該片段將如下所示。

private void checkZIP(ZipInputStream zInpStream, ZipFile zf) { 
    try { 
    ZipEntry zipEntry = zInpStream.getNextEntry(); 
    while (zipEntry != null) { 
     String entryName = zipEntry.getName(); 

     if(entryName.endsWith(".zip")) 
      checkZIP(new ZipInputStream(zf.getInputStream(zipEntry)),<NEW ZIPFILE OBJECT FOR THIS ENTRY>); 


     //other files parsing apart from zip. 

     zInpStream.closeEntry(); 
     zipEntry = zInpStream.getNextEntry(); 
    } 
    zInpStream.close(); 
    } catch(Exception ioe) { 
    //catching specific exceptions here. But did not want to put al 
    } 
} 

編輯:我需要因爲zip文件的對象。如果我遇到一個XML文件,我需要創建一個Document對象。因此,如果我通過DocumentBuilderparse()方法的普通zipInputStream,它會關閉流,我無法再使用它。所以我用(ZipFile object).getInputStream(currentEntryForXML)裏面的DocumentBuilder parse().

+2

然後延伸'FilterInputStream'重寫'close'方法作爲無操作,並與這些中的一個包裹'ZipInputStream'。 – erickson 2009-10-01 06:11:51

+3

請注意 - 有可能(並且已經完成)創建一個遞歸zipfile:http://www.steike.com/code/useless/zip-file-quine/ – 2009-10-01 06:16:11

+0

是的,我會小心的..非常感謝 – vpram86 2009-10-01 06:18:24

回答

4

你不能創建zip文件壓縮文件裏面的檔案。但爲什麼你需要在你的方法中使用這個論點?如果你只需要一個流,只需用你的說法zInpStream爲contstructor參數,如

checkZIP(new ZipInputStream(zInpStream)); 

調用zInpStream.getNextEntry()後zInpStream已經位於該項目的開頭,將只讀該條目,直到getNextEntry ()將被調用。

編輯。看到你的編輯。似乎,如果你阻止流關閉,它就足夠了。只需使用略微修改的FilterInputStream,它將zipInputStream中的close()調用委託給closeEntry(),而不是關閉。

public class ZipGuard extends java.io.FilterInputStream { 
    public ZipGuard(ZipInputStream is) { 
     super(is); 
    } 

    @Override 
    public void close() throws IOException { 
     ((ZipInputStream) in).closeEntry(); 
    } 
} 

而創建該保護在checkZip:

checkZip(new ZipInputStream(new ZipGuard(zInpStream))); 
+0

請檢查我的編輯。我使用相同的流來解析XML,如果我在zip中找到一個。它關閉了流。 – vpram86 2009-10-01 06:05:28

+0

它的工作! :) 非常感謝!! :) – vpram86 2009-10-01 06:18:55