2013-08-30 37 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是的,这种技术可以伤害压缩比。多少 - 取决于数据和处理器数量。 –