我对字符串test-string
应用了gzip压缩。当我将Scala 2.13.8与Java 11.0.13(Java HotSpot(TM)64位服务器虚拟机)一起使用时,它会导致压缩字符串H4sIAAAAAAAAACtJLS7RLS4pysxLBwCFdJByCwAAAA==.
然而,当我在Java 17.0.4.1(OpenJDK 64位服务器虚拟机)上使用Scala 2.13.8执行相同的压缩操作时,它会产生H4sIAAAAAAAA/ytJLS7RLS4pysxLBwCFdJByCwAAAA==.
,然而,这两个压缩字符串都正确解压缩以检索原始字符串test-string
。
我假设这可能取决于几个因素,比如默认压缩级别:Java 11和Java 17的默认压缩级别可能不同,导致相同输入的输出不同。算法改进:Java 17中的Gzip实现可能已经优化,导致不同的压缩结果。内部实现细节:Gzip压缩的内部实现细节可能在Java 11和Java 17之间发生了变化,从而影响了压缩输出。
这背后的原因可能是什么?我附上下面的代码。
val bos = new ByteArrayOutputStream("test-string".length)
val b64os = new Base64OutputStream(bos)
val gzip = new GZIPOutputStream(b64os)
gzip.write("test-string".getBytes("UTF-8"))
gzip.close()
val compressed = new String(bos.toByteArray, "UTF-8")
bos.close()
compressed.trim
字符串
1条答案
按热度按时间weylhg0b1#
如果我们用十六进制来查看您的两个输出,我们有这两段数据
字符串
基本上是一个字节从0变成了255(十六进制的ff)。这是gzip格式的OS header,在java 16中从0变成了255,如下所示:https://bugs.openjdk.org/browse/JDK-8244706