我想知道是否有办法直接从ZipFile
/ZipInputStream
中读取特定文件,而无需遍历整个条目集。我想如果存档文件包含大量文件,这可能会是一笔相当大的开销。有没有更好的办法?有没有办法从ZipInputStream中读取特定的文件,而无需遍历整个条目集?
我知道这可以用TrueZip
来完成,我之前就已经完成了,但我想知道1.8 SDK是否包含现在更适合的东西......?
我想知道是否有办法直接从ZipFile
/ZipInputStream
中读取特定文件,而无需遍历整个条目集。我想如果存档文件包含大量文件,这可能会是一笔相当大的开销。有没有更好的办法?有没有办法从ZipInputStream中读取特定的文件,而无需遍历整个条目集?
我知道这可以用TrueZip
来完成,我之前就已经完成了,但我想知道1.8 SDK是否包含现在更适合的东西......?
ZipFile
有这样做的方法getEntry(String)
。如果你的意思是代码永远不会遍历条目,那么不,你不能这样做。一个zip文件中的条目是无序的,所以你可以得到的最好的是O(n)迭代搜索。
在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文件系统的实例。
我应该理解你可以简单地用'FileInputStream'封装从'FileSystem'获得的'Path',然后继续阅读它? (一个例子会很棒)。 – carlspring
@carlspring我已经添加了一个简单的例子。请注意,我链接到的Zip文件系统提供程序上的Oracle文档包括一些简单的示例和更多深入示例的源代码链接。 –
谢谢,例如,但它不能编译,因为'FileSystem.newFileSystem'接受一个'String',而不是'Path'。根据我所看到的,路径似乎需要像'uri:file:/// path/to/foo.txt',但我似乎无法使其工作。你有没有尝试过上面的代码? – carlspring
据我所知没有。我倾向于遍历并构建列表或地图 – MadProgrammer
没有没有。该文件位于ZIP文件的某个位置,您必须迭代才能找到它。它不像你想象的那么昂贵,只是一系列的寻求。 – EJP