使用Java中的块压缩大型文件

时间:2014-02-06 17:31:36

标签: java file compression huffman-code lzw

我使用两种压缩算法的连续应用程序在Java中压缩超过2GB的文件;一个基于LZ和一个基于霍夫曼。 (这与DEFLATE相似)。

由于2GB太大而无法保存在任何缓冲区中,我必须通过一个输出临时文件的算法传递该文件,然后通过输出最终文件的第二个算法传递该临时文件。

另一种方法是将文件压缩为8MB块(我没有出现Out-Of-Memory错误的大小),但后来我无法充分利用整个文件中的冗余。

任何想法如何执行这些操作更整洁。没有临时文件,也没有压缩块?是否有其他压缩工具压缩块?他们如何处理这个问题?此致

3 个答案:

答案 0 :(得分:1)

Java附带“java.util.zip”库,以ZIp格式执行数据压缩。 整体概念非常简单。

Library使用“FileInputStream”读取文件。 并将文件名添加到“ZipEntry”并将其输出到“ZipOutputStream”

导入java.util.zip.ZipEntry和导入java.util.zip.ZipOutputStream用于将Zip文件夹导入程序。

But how can decompress a file

答案 1 :(得分:0)

溪流管道有什么问题?您可以从InputStream读取,压缩字节并将其写入连接到下一算法的输入流的输出流。请查看PipeInputStreamPipeOutputStream

我希望这些算法可以递增地工作。

答案 2 :(得分:0)

您可以使用两个java.util.zip级别。首先,只连接所有文件(不压缩)。如果可能,按文件类型对条目进行排序,以使类似文件彼此相邻(这将提高压缩率)。其次,压缩此流。您不需要分两个阶段运行;相反,你可以在第二阶段包装第一阶段,如CompressStream(ConcatenateFiles(directory))。这样你在另一个zip文件中有一个zip文件:外部zip文件被压缩,内部不是,并包含所有实际文件。

java.util.zip过去常常遇到大于2 GB的文件问题(我确实遇到过这些问题)。但是,我认为仅ZipFile而非ZipIn/OutputStream的情况。此外,我认为这些问题已在最近的Java版本中修复。

缓冲区大小:常规压缩算法(如Deflate)不会受益于大于64 KB的块大小。更高级的算法可以从使用更大的块大小中受益,例如bzip2 up to 900 KBLZMA2 up to 2 MB。超出此范围的任何内容更有可能是data deduplication的域名,这可能会或可能不会对您想要做的事情有意义。