问题描述
为了解压缩使用 Deflator 算法压缩的消息,我编写了以下代码:
def decompressMsg[V: StringDecoder](msg: String): Try[V] = {
if (msg.startsWith(CompressionHeader)) {
logger.debug(s"Message before decompression is: ${msg}")
val compressedByteArray =
msg.drop(CompressionHeader.length).getBytes(StandardCharsets.UTF_8)
val inflaterInputStream = new InflaterInputStream(
new ByteArrayInputStream(compressedByteArray)
)
val decompressedByteArray = readDataFromInflaterInputStream(inflaterInputStream)
StringDecoder.decode[V](new String(decompressedByteArray,StandardCharsets.UTF_8).tap {
decompressedMsg => logger.info(s"Message after decompression is: ${decompressedMsg}")
})
} else {
StringDecoder.decode[V](msg)
}
}
private def readDataFromInflaterInputStream(
inflaterInputStream: InflaterInputStream
): Array[Byte] = {
val outputStream = new ByteArrayOutputStream
var runLoop = true
while (runLoop) {
val buffer = new Array[Byte](BufferSize)
val len = inflaterInputStream.read(buffer) // ERROR IS THROWN FROM THIS LINE!!
outputStream.write(buffer,len)
if (len < BufferSize) runLoop = false
}
outputStream.toByteArray
}
输入参数 'msg' 是使用 Deflator 压缩的。上面的代码失败并显示错误消息:
无效的存储块长度 java.util.zip.ZipException: invalid 存储块长度
在我看到 this thread 后,我将 StandardCharsets.UTF_8 更改为 StandardCharsets.ISO_8859_1,令人惊讶的是,代码通过并返回了所需的行为。
我不想使用不同于 UTF_8 的编码。你知道如何让我的代码使用 UTF_8 编码吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)