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中查看示例。
这个问题指向相同的问题,而被接受的答案基本上是:不要使用setter设置级别,在构造函数中设置。在我看来远非令人满意-为什么setLevel()
存在?它是坏了还是我们漏掉了什么?
Deflater
API似乎存在一个bug...阅读javadoc,不清楚.finish()
到底是做什么的。最后一个答案中提出的解决方法可行吗? - fge