2013-08-16 106 views
2

對不起,令人困惑的標題。基本上我有一個ZipFile,它有一堆.txt文件,但也有一個文件夾。我在下面顯示的代碼是在zip條目中找到該文件夾​​。我已經完成了這部分工作。問題是,一旦我找到該文件夾​​,它就是一個ZipEntry。其中沒有碰巧有任何有用的方法來獲取該文件夾中的條目。我找到的文件夾中有更多.txt文件,我想要處理(這是主要目標)。如何訪問ZipEntry中的文件夾內的文件

zipFile = new ZipFile(zipName); 
Enumeration<? extends ZipEntry> entries = zipFile.entries(); 
while(entries.hasMoreElements()){ 
    ZipEntry current = entries.nextElement(); 
    if(current.getName().equals(folderName)) { 
     assertTrue(current.isDirectory()); 
     //Here is where I want to get the files in the folder 
    } 
} 

回答

3

ZipEntry有一個方法isDirectory()如果這是一個目錄條目,其

返回true。目錄條目是 ,其名稱以'/'結尾。

你想要做的是遍歷所有的條目(如你所做的),並獲得InputStream爲目錄內的那些,即。有相對於​​目錄的路徑。

folderName的值爲"/zip/myzip/directory",那麼該目錄內的文件將具有名稱"/zip/myzip/directory/myfile.txt"。您可以使用Java NIO Path API來幫助你

Path directory = Paths.get("/zip/myzip/directory"); // you get this directory path from the ZipEntry 
Path file = Paths.get(current.getName()); 
if (file.startsWith(directory)) { 
    // do your thing 
} 

你可以得到一個Zip文件中的InputStream作爲

zipFile.getInputStream(current); 

注意該路徑將是相對於拉鍊位置的根。如果拉鍊是

C:/Users/You/Desktop/myzip.zip 

與展會Zip文件裏直接一個文件夾類似

路徑
directory/ 
-1

類似的東西可以幫助你

final ZipFile zf = new ZipFile(filename); 
for (final Enumeration<? extends ZipEntry> e = zf.entries(); e.hasMoreElements();) { 
final ZipEntry ze = e.nextElement(); 
if (!ze.isDirectory()) { 
    final String name = ze.getName(); 
    //..... 
    } 
} 

享受它;-)

-1

其實有一個更簡單的方法來做到這一點。如果您知道當前條目是一個目錄,那麼當使用ZipInputStream時,下一個元素將自動成爲該目錄中的任何內容。例如,假設你的目錄結構是這樣的:

Dir1/A.txt Dir1/B.txt Dir2/C.txt D.txt 

然後訪問所有三個以上你只需要去了解這樣說:

ZipInputStream Zis = new ZipInputStream(in); 
ZipEntry entry = Zis.getNextEntry(); 
while (entry != null) { 
    if(!entry.isDirectory) 
     //do something with entry 
    //else continue 
    entry = Zis.getNextEntry(); 
} 

這將通過所有文件循環(以他們列出的順序),而不必明確檢查他們是否是目錄,因爲你沒有做任何與他們不同的事情。

相關問題