2015-04-17 56 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

相關問題