- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
Deflater.setLevel()对我来说没有预期的效果。
static void test1() throws Exception {
byte[] output = new byte[20];
Deflater compresser = new Deflater();
// compresser.setLevel(Deflater.BEST_COMPRESSION);
compresser.setInput("blah".getBytes("UTF-8"));
compresser.finish();
int len = compresser.deflate(output);
System.out.println("len="+ len+ " " +Arrays.toString(output));
}
以上对我来说工作正常(Java 7),但是当我取消注释 compresser.setLevel()
行时,它会中断(deflate()
返回 0 字节) .除了 DEFAULT
之外,任何压缩级别都会发生同样的情况。更具体地说,它仅在水平集与构造函数中设置的水平集(显式或隐式,如此处)相同时才“起作用”(相反,它是无害的)——也就是说,它只能在无用时使用。
请参阅 Ideone 中的示例.
This question指向相同的问题,接受的答案基本上是这样说的:不要使用 setter 设置级别,在构造函数中执行。 IMO 远非令人满意 - 为什么 setLevel()
存在?它坏了还是我们遗漏了什么?
最佳答案
我深入研究了 JDK 源代码。它确实设定了水平。如果您在 setLevel()
之后使用 compresser.deflate(new byte[0]);
,那么它将起作用。
发生的事情是,在 setLevel()
之后第一次调用 deflate()
会看到级别发生了变化,并调用 zlib 的 deflateParams()
函数来改变它。 deflateParams()
然后将压缩可用数据,但您请求 finish()
的事实不会传递。然后,JDK 实现不会使用 Z_FINISH
调用 deflate()
。结果,您提供的数据被发送进行压缩,压缩器累积数据,但它不会发出压缩 block ,因为它没有被要求完成。所以你什么也得不到。
您需要在 setLevel()
之后调用 deflate()
才能实际设置级别。然后后续数据将使用新级别进行压缩。
重要的是要注意,在 setLevel()
之后的第一个 deflate()
调用之前提供的数据将使用 old 压缩级别。只有在 deflate()
调用之后提供的数据才会使用新级别。因此,如果在您的示例中,您只是在最后一个之后执行了另一个 deflate()
,它将应用 finish()
并且您将获得压缩数据,但它会使用默认压缩级别。
关于java - Deflater.setLevel() 有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17632314/
我在一个经常受到机器人网络攻击的网站工作。我们已经开始使用这个工具:http://deflate.medialayer.com/哪个自动禁止具有比设置值更多的开放连接的 ip。默认情况下它设置为 15
我看到一个奇怪的情况,Java 8u45 和 java.util.Deflater.deflate(byte[] b, int off, int len, int flush) 的输出缓冲区很小与小输
zlib docs指定可以将负的 windowBits 参数传递给 deflateInit2() 函数: windowBits can also be –8..–15 for raw deflate.
我写了一些 Javascript 代码。用base64压缩并放气 function base64 (str) { return new Buffer(str).toString("base64
在 Java 7 中,Deflater添加了对某些压缩参数的支持(模式:FULL_FLUSH、SYNC_FLUSH)。我猜他们对应的 Zlib 类似 constants在标准 API 中(虽然这个 A
我遇到了一些 zlib 压缩的不同实现之间不兼容的问题。 作为测试用例,我想创建具有 10000 个 double 的测试数据,范围从 0 到 10000。 我创建了一些测试代码来压缩和解压缩此数据,
我正在将一个 Python 应用程序移植到 Android,在某些时候,这个应用程序必须与 Web 服务通信,向它发送压缩数据。 为了做到这一点,它使用了下一个方法: def stuff(self,
我目前正在实现一个 png 阅读器,但我对数据的位顺序和一般格式感到困惑。 我无法访问 libpng、zlib 或类似软件。 请注意,我写的任何位串都是最高有效位在前。 根据 RFC1951 , "数
我目前正在实现一个 png 阅读器,但我对数据的位顺序和一般格式感到困惑。 我无法访问 libpng、zlib 或类似软件。 请注意,我写的任何位串都是最高有效位在前。 根据 RFC1951 , "数
我正在将大量对象保存到一个文件中,然后反序列化它们。生成的 xml 文件大小约为 3 gig。 我希望反序列化非常快,所以我尝试了所有三种方法(xml、二进制、压缩) 显然,反序列化压缩文件比 XML
这个问题在这里已经有了答案: Zlib deflated input is larger than original input string of chars? (3 个答案) 关闭 5 年前。
我目前正在尝试创建自定义 Deflate在 C# 中实现。 我目前正在尝试实现“模式搜索”部分,其中我有(最多)32k 的数据,并且正在尝试为我的输入搜索最长的可能模式。 RFC 1951定义 Def
我听到了关于MsgPack的一些信息,可用于压缩json消息,但是我对此有一个疑问,为什么不简单地使用Gzip / Deflate而不是MsgPack?我认为调试也更好。 最佳答案 msgpack是一
我花了大约 48 小时尝试解决 gzip deflate 问题,并意识到我可能需要寻求帮助,呵呵。 在意识到我需要在 php.ini 文件中打开压缩之后,我终于通过 .htaccess 在我的共享 U
让 zlib 在每个请求期间压缩网页似乎是多余的。这也是我的文件响应时间的瓶颈。有没有办法缓存 zlib 文件,以便每次修改时只压缩一次?还是我应该继续愿望? 最佳答案 如果您想要一个快速而懒惰的解决
我正在尝试找出如何禁用服务器上特定目录的 DEFLATE 模块(gzipping)。这是我在/etc/httpd/conf/httpd.conf 中的内容 AddOutputFilterByType
我正在开发一个文件压缩程序。我们目前正在实现 .ZIP 存档器标准,以便在生成压缩的 .ZIP 存档器时,任何其他信誉良好的压缩器(例如 7zip)都可以完美地理解/解压缩它。 我们现在正在开发基于R
我使用 Deflater 编写了一个备份程序SHA-1 用于存储文件和哈希值。我看到Java的Deflater使用zlib 。如果我显式设置 Deflater 的级别,无论平台和 JRE 版本如何,我
我想在保存到文件之前压缩字节数组。当我使用 Deflator 压缩字节数组时,出现 OutOfMemoryError: ERROR/dalvikvm-heap(16065): Out of memor
需要一些帮助来了解 DEFLATE 编码的工作原理。我知道这是 LZSS 算法和霍夫曼编码的组合。 因此,让我们编码例如“延迟放气”。参数:[Search buffer: 8kb and Look-a
我是一名优秀的程序员,十分优秀!