2011-03-30 39 views
12

我試過java.util.zip包,實在太慢了。從包含大量文件的zip文件中提取1個文件的最快方法是什麼?

然後我發現LZMA SDK7z jbinding但他們也缺乏一些東西。 LZMA SDK不提供如何使用的文檔/教程,這是非常令人沮喪的。沒有javadoc。

儘管7z jbinding沒有提供簡單的方法來提取只有一個文件,但是,它只提供瞭解壓縮文件的所有內容的方法。此外,它不提供指定放置解壓縮文件的位置的方法。

有什麼想法嗎?

回答

15

你的代碼與java.util.zip的外觀是什麼樣的,以及你處理的zip文件有多大?

我能夠在一個大致與第二項1800提取4MB進入了一個200MB的zip文件與此:

OutputStream out = new FileOutputStream("your.file"); 
FileInputStream fin = new FileInputStream("your.zip"); 
BufferedInputStream bin = new BufferedInputStream(fin); 
ZipInputStream zin = new ZipInputStream(bin); 
ZipEntry ze = null; 
while ((ze = zin.getNextEntry()) != null) { 
    if (ze.getName().equals("your.file")) { 
     byte[] buffer = new byte[8192]; 
     int len; 
     while ((len = zin.read(buffer)) != -1) { 
      out.write(buffer, 0, len); 
     } 
     out.close(); 
     break; 
    } 
} 
+1

我們正在做一個Web應用程序爲外人使用.....我們談論每秒20個請求。我們已經研究了使用java.util.zip解壓縮文件的速度將在0.5s到2s之間。這很慢。 – lamwaiman1988 2011-03-30 09:16:44

+2

我假設你在談論每秒20個請求,需要一個zip文件。爲什麼不提前將這些文件完全解壓並直接從文件系統提供服務? – WhiteFang34 2011-03-30 09:21:38

+4

如果FileInputStream和ZipInputStream之間有BufferedInputStream,則代碼會更快。 – EJP 2011-03-30 23:53:56

6

使用ZipFile而非ZipInputStream

儘管文檔沒有說明這是什麼(它在JarFile的文檔中),但它應該使用隨機訪問文件操作來讀取文件。由於一個ZIP文件在一個已知位置包含一個目錄,這意味着爲了找到一個特定的文件,IO很少發生。

一些注意事項:據我所知,Sun實現使用內存映射文件。這意味着您的虛擬地址空間必須足夠大以容納該文件以及JVM中的其他所有內容。這可能是32位服務器的問題。另一方面,它可能足夠聰明,可以避免32位內存映射或內存映射只是目錄;我沒有嘗試。

此外,如果您使用多個文件,請務必使用try/finally以確保文件在使用後關閉。

7

我沒有基準速度,但與Java 7或更高,我提取一個文件如下。
我會想象它比ZipFile API更快:

簡單例子從一個zip文件test.zip提取META-INF/MANIFEST.MF

// file to extract from zip file 
String file = "MANIFEST.MF"; 
// location to extract the file to 
File outputLocation = new File("D:/temp/", file); 
// path to the zip file 
Path zipFile = Paths.get("D:/temp/test.zip"); 

// load zip file as filesystem 
try (FileSystem fileSystem = FileSystems.newFileSystem(zipFile, null)) { 
    // copy file from zip file to output location 
    Path source = fileSystem.getPath("META-INF/" + file); 
    Files.copy(source, outputLocation.toPath()); 
} 
+0

謝謝。這工作:) – 2017-08-30 10:21:08

+0

工程,閃電般快......這應該是公認的答案(假設Java 7或更高版本)。 – leo 2017-12-10 05:17:45

相關問題