2

我想知道是否有一种方法可以直接从ZipFile/读取特定文件,ZipInputStream而无需遍历整个条目集。如果存档包含大量文件,我想这可能是相当大的开销。有没有更好的办法?

我知道这可以做到,TrueZip而且我之前已经做到了,但我想知道 1.8 SDK 现在是否包含更合适的东西......?

4

2 回答 2

3

在 java 7 中,您可以将zip 文件视为 Filesystem

虽然这确实提供了一些方便的访问方法,但它与遍历条目列表以查找单个文件相比不太可能执行任何不同的操作。

要获取特定路径的输入流:

Path zipfile = Paths.get("/codeSamples/zipfs/zipfstest.zip");
FileSystem fs = FileSystems.newFileSystem(zipfile, null);
Path entry = fs.getPath("/my/entry.txt");
InputStream is = Files.newInputStream(entry);

完成后还要确保关闭FileSystem 实例。

http://docs.oracle.com/javase/8/docs/api/java/nio/file/FileSystem.html#getPath-java.lang.String-java.lang.String...-

http://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#newInputStream-java.nio.file.Path-java.nio.file.OpenOption...-

于 2015-04-17T02:43:21.537 回答
0

ZipFilegetEntry(String)这样做的方法。但是,如果您的意思是代码从不遍历条目,那么不,您不能这样做。zip 文件中的条目是无序的,因此您可以获得的最佳结果是 O(n) 迭代搜索。

Javadoc 链接

于 2015-04-17T02:39:17.287 回答