有没有办法从ZipInputStream读取特定文件而不必迭代整个条目集?

时间:2015-04-17 01:17:14

标签: java zipinputstream

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

我知道可以使用TrueZip完成此操作并且我之前已经完成了,但我想知道1.8 SDK是否包含现在更适合的内容......?

2 个答案:

答案 0 :(得分:3)

在java 7中,您可以对待zip files as a 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);

完成后,还要确保close 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...-

答案 1 :(得分:0)

ZipFile使用getEntry(String)方法执行此操作。如果你的意思是代码永远不会遍历条目,那么,不,你不能这样做。 zip文件中的条目是无序的,因此最好的是O(n)迭代搜索。

Javadoc link