通过java以有效的方式压缩文件

时间:2013-08-30 08:45:29

标签: java

我正在生成一个大小为1 GB的文件,现在我必须通过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

        }

1 个答案:

答案 0 :(得分:1)

我假设你的“有效”一词意味着尽可能快。您可以使用GZIPOutpuStream压缩一个大文件或ZipOutputStream来压缩文件数量并将它们连接成一个zip库。两者都在标准的javadocs中得到了很好的解释。

长话短说,为了提高效率 - 同时使用更多CPU - 将大文件分成块,让不同的线程同时压缩它们并连接输出。在接收方面,反之亦然。

标准zip类的一个缺点是两个都只在一个CPU /核上运行单线程。所以他们可能没有效率。这是因为压缩算法本身是单线程的。现有的并行化版本获取数据块并将其压缩到不同的线程中。然后他们有相应的解压逻辑。您可以通过在网上搜索PIGZ找到大量关于此的材料。

根据@VictorSeifert的评论进行编辑

压缩比主要取决于三件事:您的数据(显然),压缩的深度和块大小。可以使用setLevel()在java类中控制压缩深度。块大小可以自由选择。块越大,压缩越好,但可以实现的并行性越小。

例如,PIGZ默认使用128 kb的块,并维护一个32kb的字典,以便压缩块在块之间变得更好。我自己用1mb积木和没有字典取得了不错的成绩。这本词典为线程模型增加了很多复杂性,到目前为止我的问题还不够大。