列出.zip目录而不解压缩

Bob*_*dov 10 java zip

我正在用Java构建一个文件浏览器,我在JTrees中列出了文件/文件夹.我现在要做的是当我到达一个压缩文件夹时,我想列出其内容,但不首先提取它.

如果有人有想法,请分享.

aio*_*obe 17

我建议你看看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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Java 8,则可以避免使用几乎弃用的EnumerationZipFile::stream,如下所示:

zipFile.stream()
       .map(ZipEntry::getName)
       .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

如果您需要知道条目是否是目录,您可以使用ZipEntry.isDirectory.除了没有提取文件之外,您无法获得更多信息(出于显而易见的原因).


如果要避免提取所有文件,可以使用ZipFile.getInputStream每个文件一次提取一个文件ZipEntry.(请注意,您不需要将解压缩的数据存储在磁盘上,您可以只读取输入流并丢弃字节.

  • 从java 7开始,我会说通过`FileSystem`使用NIO,`Path`和`Files`是一种更容易(和统一的方式)或解决这个问题.请参阅:http://stackoverflow.com/a/37413531/80779和http://stackoverflow.com/a/37413128/80779 (4认同)

Ale*_*s G 9

使用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();
    ...
}
Run Code Online (Sandbox Code Playgroud)