2008-10-14 62 views
6

我用這個代碼創建的.zip文件用的列表:使用Java創建.zip壓縮文件的緩衝區大小是多少?

ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile)); 

for (int i=0;i<srcFiles.length;i++){ 
    String fileName=srcFiles[i].getName(); 
    ZipEntry zipEntry = new ZipEntry(fileName); 
    zos.putNextEntry(zipEntry); 
    InputStream fis = new FileInputStream(srcFiles[i]); 
    int read; 
    for(byte[] buffer=new byte[1024];(read=fis.read(buffer))>0;){ 
     zos.write(buffer,0,read); 
    } 
    fis.close(); 
    zos.closeEntry(); 
} 
zos.close(); 

我不知道的zip算法和ZipOutputStream是如何工作的,如果它之前,我讀寫的東西發送至「ZOS '所有的數據,結果文件的字節大小可能會不同於選擇另一個緩衝區大小。

換句話說

我不知道該算法是這樣的:

讀數據 - >加工數據 - >創建.ZIP

數據 - 讀CHUNK >處理數據塊 - >在.ZIP中寫入數據塊 - > | ^ ------------------------------------------------ -------------------------------------------------- ---------------------------

如果是這樣的話,什麼緩衝區大小是最好的?

更新:

我已經測試此代碼,改變緩衝大小從1024到64和壓縮和解相同的文件:與1024字節的80 KB結果文件比用64個字節緩衝器更小3個字節。在最大的時間裏生成最小的.zip的最佳緩衝區大小是多少?

回答

10

簡答:我會選擇16k。


龍答:

ZIP使用壓縮(http://en.wikipedia.org/wiki/DEFLATE)DEFLATE算法。 Deflate是Ziv Lempel Welch的味道(搜索維基百科LZW)。 DEFLATE使用LZ77和霍夫曼編碼。

這是一個字典壓縮,和饋送該數據到deflater當作爲遠離算法的角度來看,因爲我知道所使用的緩衝區大小應幾乎沒有影響。對於LZ77最大的影響是字典大小和滑動窗口,在您的示例中,它們不受緩衝區大小控制。

我想你可以用不同的緩衝區大小實驗,如果你想和繪製圖形,但我相信你不會看到壓縮比(80000分之3= 0.00375%)任何顯著的變化。

緩衝區的大小有最大的影響是由於,當你做出FileInputStream.read和zos.write的調用,執行的開銷代碼量的速度。從這個角度來看,你應該考慮到你所得到的和你所花費的。

當從1個字節提高到1024個字節,就會失去1023個字節(理論),並且獲得在.read和.WRITE方法〜1024減少輔助時間。 但是,當從1k增加到64k時,您花費了63k,從而將開銷減少了64倍。

因此,這帶有報酬遞減,所以我會選擇在中間某個地方(比方說16K),並與堅持。

+0

我接受這個答案,因爲它顯示緩衝區大小不會顯着影響結果大小,但字典大小和滑動窗口 – Telcontar 2008-10-14 15:16:34

0

取決於您擁有的硬件(磁盤速度和文件搜索時間)。我會說,如果你不想擠壓最後一滴表現,選擇4k和64k之間的任何大小。由於它是一個短暫的對象,無論如何它都會被快速收集。

相關問題