Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.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 Deflater策略-默认策略、过滤策略和HUFFMAN策略_Java_Compression_Gzip_Deflate - Fatal编程技术网

Java Deflater策略-默认策略、过滤策略和HUFFMAN策略

Java Deflater策略-默认策略、过滤策略和HUFFMAN策略,java,compression,gzip,deflate,Java,Compression,Gzip,Deflate,我试图在压缩JavaWebApp响应时在性能和压缩程度之间找到平衡 在查看平减指数类时,我可以设置一个级别和策略。级别是自解释的-最佳速度到最佳压缩 我不确定策略-DEFAULT\u策略,过滤和HUFFMAN\u仅 我可以从Javadoc中了解到一些道理,但我想知道是否有人在他们的应用程序中使用了特定的策略,以及您是否看到了性能/压缩程度方面的任何差异。我相信Java Deflater中提到的策略选项源自zlib和()以及DEFLATE()的zlib(C)实现。它们存在于几乎所有实现DEFLAT

我试图在压缩JavaWebApp响应时在性能和压缩程度之间找到平衡

在查看平减指数类时,我可以设置一个级别和策略。级别是自解释的-
最佳速度
最佳压缩

我不确定策略-
DEFAULT\u策略
过滤
HUFFMAN\u仅


我可以从Javadoc中了解到一些道理,但我想知道是否有人在他们的应用程序中使用了特定的策略,以及您是否看到了性能/压缩程度方面的任何差异。

我相信Java Deflater中提到的策略选项源自zlib和()以及DEFLATE()的zlib(C)实现。它们存在于几乎所有实现DEFLATE的压缩库中

要理解它们的意思,你需要了解一些。压缩算法结合了LZ77和哈夫曼编码。基本原则是:

  • LZ77压缩通过查找重复的数据序列来工作。实现通常使用1k到32k之间的“滑动窗口”,以跟踪之前的数据。对于原始数据中的任何重复,LZ77压缩不会在输出中插入重复数据,而是插入“反向参考”。想象一下后面的引用说“在这里,插入与您之前看到的8293字节相同的数据,共17个字节”。back ref被编码为这对数字:长度(在本例中为17)和距离(或偏移量)(在本例中为8293)

  • 哈夫曼编码用编码代替实际数据。当数据显示为X时,哈夫曼代码显示为Y。这显然有助于压缩,但前提是替换项比原始项短。(一个反例是在吉姆·凯瑞的电影中,诺姆用“Car”作为卡尔的简称。卡尔指出卡尔已经很短了。)哈夫曼编码算法进行频率分析,并使用最短的替代品来代替最常出现的数据序列


Deflate结合了这些,因此可以在LZ77背面参考上使用哈夫曼代码。各种DEFLATE/ZLIB压缩器上的策略选项只告诉库Huffman与LZ77的权重

  • FILTERED
    通常表示LZ77匹配在长度为5时停止。所以当文件上说

    使用(过滤)过滤器(或预测器)生成的数据。。。过滤后的数据主要由一些随机分布的小值组成

    (来自)
    …我对代码的理解是,它可以进行LZ77匹配,但最多只能匹配5个字节或更少的序列。我想这就是doc所说的“小值”的意思。但是文档中没有提到数字5,因此不能保证数字不会从一个版本变为另一个版本,或者从一个ZLIB/DEFLATE实现变为另一个(如C版本和Java版本)

  • HUFFMAN_ONLY
    说,只做基于频率分析的替换码
    HUFFMAN_ONLY
    速度非常快,但对大多数数据的压缩效果不是很好。除非您的字节值范围很小(例如,如果实际数据流中的字节仅取可能的255个值中的20个),或者以牺牲大小为代价对压缩速度有极端要求,
    HUFFMAN_only
    将不是您想要的

  • DEFAULT
    以作者期望的方式将这两者结合起来,这对于大多数应用程序来说都是最有效的


据我所知,在DEFLATE中没有办法只做LZ77。没有
LZ77_,只有
策略。但当然,你可以建立或获得自己的LZ77编码器,这将是“LZ77只”


请记住,该策略永远不会影响压缩的正确性;它只影响它的性能和操作,以及它的性能,无论是速度还是大小


还有其他调整压缩机的方法。一个是设置LZ77滑动窗口的大小。在C库中,这是用“窗口位”选项指定的。如果您了解LZ77,那么您就知道,窗口越小,返回的搜索就越少,这意味着压缩速度越快,但会丢失一些匹配项。这通常是压缩时转动的更有效的旋钮


底线是,对于80%的情况,你不在乎调整策略。您可能会对摆弄窗口位感兴趣,只是为了看看会发生什么。但只有当你在应用程序中完成了所有需要做的事情后,才可以这样做


参考资料: