2011-08-05 81 views
1

我需要壓縮/解壓縮不同類型包含在一個文件夾中的文件夾的大小可能會超過10-11 GB的文件。 我使用下面的代碼,但這需要很長時間來壓縮數據。在java中壓縮和解壓大型數據?

BufferedReader in = new BufferedReader(new FileReader("D:/ziptest/expansion1.MPQ")); 
BufferedOutputStream out = new BufferedOutputStream(
    new GZIPOutputStream(new FileOutputStream("test.gz"))); 

int c; 
while ((c = in.read()) != -1) 
    out.write(c); 
in.close(); 
out.close(); 

請建議我一些Java中快速壓縮和解壓圖書館,我也想在不同部位的大文件分割,如在每一個100MB的塊。

+2

如果你想壓縮暴雪MoPaQ文件,那麼你可能不會看到太多的壓縮。文件格式已經壓縮。 – Qwerky

回答

7

讀/寫卡僅適用於文本,如果你嘗試讀取的二進制,這些是會遭到損壞。

相反,我建議你使用的FileInputStream。複製數據的最快方法是使用您自己的緩衝區。

InputStream in = new FileInputStream("D:/ziptest/expansion1.MPQ"); 
OutputStream out = new GZIPOutputStream(
      new BufferedOutputStream(new FileOutputStream("test.gz"))); 

byte[] bytes = new byte[32*1024]; 
int len; 
while((len = in.read(bytes)) > 0) 
    out.write(bytes, 0, len); 

in.close(); 
out.close(); 

既然你讀取字節的大塊,它是更有效不BufferedInput/OuptuStream,因爲這將刪除一個副本。 GZIPOutputStream後面有一個BufferedOutptuStream,因爲你無法控制它產生的數據的大小。

BTW:如果你只使用Java讀這篇文章,你可以使用DeflatorOutputStream,它的速度稍快和小,但只有在Java AFAIK支持。

+4

+1讀取字節而不是一次一個字節可以大大提高性能(數量級更快)。 – Qwerky