0

我正在生成一个大小为 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

        }
4

1 回答 1

1

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

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

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

根据@VictorSeifert 的评论进行编辑

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

例如,PIGZ 默认使用 128 kb 块并维护 32kb 字典,以便块与块之间的压缩效果更好。我自己用 1mb 块和没有字典就取得了很好的效果。字典给线程模型增加了很多复杂性,而我的问题到目前为止还不够大,无法解决这个问题。

于 2013-08-30T09:07:23.520 回答