【发布时间】:2012-07-13 04:00:39
【问题描述】:
我正在用 Java 构建文件资源管理器,并在 JTrees 中列出文件/文件夹。我现在要做的是,当我进入一个压缩文件夹时,我想列出它的内容,但没有先提取它。
如果有人有想法,请分享。
【问题讨论】:
-
这个 sn-p 正是这个问题所要求的:stackoverflow.com/a/54861562/5777603
我正在用 Java 构建文件资源管理器,并在 JTrees 中列出文件/文件夹。我现在要做的是,当我进入一个压缩文件夹时,我想列出它的内容,但没有先提取它。
如果有人有想法,请分享。
【问题讨论】:
我建议你看看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 一次提取一个文件。 (请注意,您不需要将解压后的数据存储在磁盘上,您只需读取输入流并丢弃字节即可。
【讨论】:
FileSystem、Path和Files使用NIO是一种更容易(和统一的方式)或解决这个问题的方法。请参阅:stackoverflow.com/a/37413531/80779 和 stackoverflow.com/a/37413128/80779
使用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();
...
}
【讨论】: