2013-08-30 67 views
0

我正在生成一個大小爲1 GB的文件,現在我必須通過java本身壓縮此文件。以高效的方式通過java壓縮文件

FileOutputStream fileOutput = new FileOutputStream(
         file); 

       BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
         fileOutput)); 

       addContent(abc, def, bw); 

       bw.close(); 
       fileOutput.close(); 

請指教,因爲我希望做一個自定義的方法,該方法將接受一個文件名和文件路徑作爲參數,將壓縮文件,類似如下:

 public void generatezipforafie(folderpath, filename) 
     { 

     //please advise the logic to zip the file 

     } 
+0

1.獲取zip庫2.使用它。看看zlib –

+1

問在谷歌。這可能會幫助你http://viralpatel.net/blogs/creating-zip-and-jar-files-in-java/ – Prabhaker

+0

你看過LZMA(也被稱爲7- zip)壓縮?它是高效的,它可以使用很多線程。 –

回答

1

我假設你的術語「高效」意味着儘可能快。您可以使用GZIPOutpuStream壓縮一個大文件或ZipOutputStream壓縮多個文件並將它們連接成一個壓縮庫。在標準的javadoc中都有很好的解釋。爲了保持長篇短小,高效率 - 同時使用更多的CPU - 將大文件分塊,讓不同的線程同時壓縮並連接輸出。在接收端,反之亦然。

標準zip類的一個缺點是它們都只在一個CPU /內核上工作。所以他們可能沒有效率。這是因爲壓縮算法本身是單線程的。現有的並行版本使用不同的線程將數據塊壓縮。然後他們有相應的解壓縮邏輯。您將通過在網上搜索PIGZ找到大量關於此的材料。

根據從@VictorSeifert

壓縮比率主要取決於三件事註釋編輯:你的數據(明顯),壓縮的深度和塊大小。使用setLevel()可以在Java類中控制壓縮深度。塊大小可以自由選擇。塊越大,壓縮越好,但可以實現更少的平行度。

PIGZ例如默認使用128 kb的塊,並維護一個32kb的字典,以便壓縮在塊之間變得更好。我自己取得了1mb塊的好成績,沒有字典。字典給線程模型增加了很多複雜性,而我的問題到目前爲止還不夠大,無法解決這個問題。

+0

你知道這對壓縮比有什麼影響嗎?據我記得壓縮依賴於在輸入數據中找到共同的子序列。不會分裂數據導致壓縮比降低? –

+0

@ViktorSeifert是的,這種技術可以傷害壓縮比。多少 - 取決於數據和處理器數量。 –