2012-07-13 58 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