2012-07-13 61 views
4

我正在建立一個Java文件瀏覽器,我列出了JTrees中的文件/文件夾。我現在想要做的是當我到達一個壓縮文件夾時,我想列出它的內容,但是沒有先提取它。列表.zip目錄沒有解壓

如果有人有想法,請分享。

回答

13

我建議你看看ZipFile.entries()

下面是一些代碼:

try (ZipFile zipFile = new ZipFile("test.zip")) { 
    Enumeration zipEntries = zipFile.entries(); 
    while (zipEntries.hasMoreElements()) { 
     String fileName = ((ZipEntry) zipEntries.nextElement()).getName(); 
     System.out.println(fileName); 
    } 
} 

如果您使用的Java 8,你能避免使用使用ZipFile::stream幾乎棄用Enumeration類如下:

zipFile.stream() 
     .map(ZipEntry::getName) 
     .forEach(System.out::println); 

如果您需要知道某個條目是否爲目錄,則可以使用ZipEntry.isDirectory。與不提取文件相比,您無法獲得更多信息(出於顯而易見的原因)。


如果你想避免提取所有文件,您可以使用ZipFile.getInputStream每個ZipEntry一次提取一個文件。 (請注意,您不需要將解壓縮的數據存儲在磁盤上,只需讀取輸入流並隨時丟棄字節。

+3

既然java 7,我會說通過'FileSystem','Path'和'Files'使用NIO是一個更容易(和統一的方式)或解決這個問題。請參閱:http://stackoverflow.com/a/37413531/80779和http://stackoverflow.com/a/37413128/80779 – LordOfThePigs 2016-05-24 12:29:25

1

對於處理ZIP文件,您可以使用類ZipFile。它有方法entries() 。包含ZIP文件中的條目返回列表此信息包含在ZIP頭,並且不需要提取

8

使用java.util.zip.ZipFile類,具體而言,其entries方法

你有這樣的事情。:

ZipFile zipFile = new ZipFile("testfile.zip"); 
Enumeration zipEntries = zipFile.entries(); 
String fname; 
while (zipEntries.hasMoreElements()) { 
    fname = ((ZipEntry)zipEntries.nextElement()).getName(); 
    ... 
} 
+0

我已經嘗試過這一點,但我必須知道它是什麼類型的文件,這將幾乎給我的文件/文件夾的名稱,我必須知道它是一個文件,一個文件夾等。 – 2012-07-13 10:07:03