Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用块压缩大型文件_Java_File_Compression_Huffman Code_Lzw - Fatal编程技术网

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

在Java中使用块压缩大型文件,java,file,compression,huffman-code,lzw,Java,File,Compression,Huffman Code,Lzw,我使用两种压缩算法的连续应用,在Java中压缩超过2GB的文件;一个基于LZ,一个基于Huffman。(这类似于DEFLATE) 由于2GB太大,无法保存在任何缓冲区中,因此我必须通过一个输出临时文件的算法传递该文件,然后通过第二个输出最终文件的算法传递该临时文件 另一种方法是将文件压缩为8MB的块(我不会遇到内存不足错误的大小),但是我无法充分利用整个文件中的冗余 如何更整洁地执行这些操作。没有临时文件,也没有块压缩?其他压缩工具是否按块压缩?他们如何处理这个问题?关于溪流管道有什么问题?您可

我使用两种压缩算法的连续应用,在Java中压缩超过2GB的文件;一个基于LZ,一个基于Huffman。(这类似于DEFLATE)

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

另一种方法是将文件压缩为8MB的块(我不会遇到内存不足错误的大小),但是我无法充分利用整个文件中的冗余


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

溪流管道有什么问题?您可以从
InputStream
读取、压缩字节并将它们写入连接到下一个算法的输入流的输出流。查看
PipeInputStream
PipeOutputStream


我希望这些算法能够逐步发挥作用

Java附带了
“Java.util.zip”
库来执行zip格式的数据压缩。 总体概念相当简单

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

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

But how can decompress a file

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

诚然,
java.util.zip
曾经在大于2GB的文件中遇到过问题(我确实遇到过这些问题)。但是,我相信这只是
ZipFile
的情况,而不是
ZipIn/OutputStream
。此外,我认为这些问题在最近的java版本中得到了解决


缓冲区大小:常规压缩算法(如Deflate)不会从大于约64 KB的数据块大小中获益。更高级的算法可以从使用更大的数据块大小中获益,例如,或。超出此范围的任何内容都更可能是的域,这可能对您想要做的事情有意义,也可能没有意义。

如果您运行的是64-b您应该能够分配足够的堆空间来使用更大的块(即1GB而不是8MB)。请查看
-Xms
-Xmx
JVM选项。在完全读取输入之前,您的算法实现不会生成任何输出吗?如果是这种情况,则您运气不佳,需要使用临时存储。然而,我严重怀疑这种情况,每个算法在读取后都会开始生成输出输入的一部分。在这种情况下,您可以使用管道将第一个算法的输出流提供给第二个算法,并将第二个算法的输出写入磁盘。我认为您高估了“充分利用整个文件中冗余的能力”。使用较小的块。虽然奇怪的是,你不能使用大于8MB的块。你似乎有一个非常小的堆。嗨,谢谢你的回答。我不理解你对这个词的递增使用。我的第一个算法必须在第二个算法可以应用之前完成。关于。我的意思是,我希望你的算法可以读取有限的数据nk字节,压缩它们,将它们写入输出流,以移动到下一个块的处理,而不必将整个输入保存在内存中,以便从头到尾对其进行处理。“我的第一个算法必须完成,然后才能应用第二个算法。”似乎很奇怪。您的第二个算法是否向后处理第一个算法的输出?此java.util.zip单独压缩和连接文件,而我希望使用固体压缩范例。java.util.zip也无法处理大文件(2GB+)。