我想知道是否有辦法直接從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