2015-04-17 23 views
0

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

我知道这可以用TrueZip来完成,我之前就已经完成了,但我想知道1.8 SDK是否包含现在更适合的东西......?

+1

据我所知没有。我倾向于遍历并构建列表或地图 – MadProgrammer

+3

没有没有。该文件位于ZIP文件的某个位置,您必须迭代才能找到它。它不像你想象的那么昂贵,只是一系列的寻求。 – EJP

回答

0

ZipFile有这样做的方法getEntry(String)。如果你的意思是代码永远不会遍历条目,那么不,你不能这样做。一个zip文件中的条目是无序的,所以你可以得到的最好的是O(n)迭代搜索。

Javadoc link

2

在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文件系统的实例。

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...-

+0

我应该理解你可以简单地用'FileInputStream'封装从'FileSystem'获得的'Path',然后继续阅读它? (一个例子会很棒)。 – carlspring

+0

@carlspring我已经添加了一个简单的例子。请注意,我链接到的Zip文件系统提供程序上的Oracle文档包括一些简单的示例和更多深入示例的源代码链接。 –

+0

谢谢,例如,但它不能编译,因为'FileSystem.newFileSystem'接受一个'String',而不是'Path'。根据我所看到的,路径似乎需要像'uri:file:/// path/to/foo.txt',但我似乎无法使其工作。你有没有尝试过上面的代码? – carlspring

相关问题