【问题标题】:ZSTD String compression using luben使用 luben 的 ZSTD 字符串压缩
【发布时间】:2021-02-04 03:04:20
【问题描述】:

我一直在努力使用 Luben 库 (v1.4.0-1) 将常规字符串压缩为 ZSTD 格式。我执行以下操作:

byte[] zstdBytes = Zstd.compress(payload.getBytes(StandardCharsets.UTF_8));
ZstdInputStream zstdInputStream= new ZstdInputStream(new ByteArrayInputStream(zstdBytes));

但是在读取 zstdInputStream 时出现以下错误:

java.io.IOException: Decompression error: Unknown frame descriptor
   at com.github.luben.zstd.ZstdInputStream.readInternal(ZstdInputStream.java:142)
   at com.github.luben.zstd.ZstdInputStream.read(ZstdInputStream.java:102)
   at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
   at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
   at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
   at java.io.InputStreamReader.read(InputStreamReader.java:184)
   at java.io.BufferedReader.fill(BufferedReader.java:161)
   at java.io.BufferedReader.read(BufferedReader.java:182)

我阅读的zstdInputStream代码如下:

try (ZstdInputStream zis = new ZstdInputStream(new UncloseableStream(payload))) {
        try (Reader reader = new BufferedReader(new InputStreamReader(zis))) {

            int data = reader.read();
            while (data != -1) {
                System.out.print((char) data);
                data = reader.read();
            }
        }
}

编辑:我的有效载荷如下: {“客户”:“CA101”,“来源”:“现场”,“操作”: "add","type": "BC","container": "c_789","token": "BC_mc-l_CA101_20101206_0","priority": 5,"jsonPayload": "{"guid":"89df67", "id":"id789","llevel":"INFO","ldate":"20180526","lthread":"Indexing-789","lmethod":"GET","afield":"aaa", "bfield":"bbb","cfield":"ccc","dfield":"ddd","efield":"eee","data":"Hello world "fancy","hostname":"uk- sx1-1","instanceid":"swg-89","service":"indexing","grid":"UK","origin":"0","time":1508,"loffset":7845 "}"}

【问题讨论】:

  • 什么是有效载荷?您在第二段代码中没有使用与第一段相同的 ZstdInputStream。请发布一个完整的示例。
  • 我没有使用同一个实例,因为它在不同的类中。

标签: java file-io compression


【解决方案1】:

所以我找到了它不起作用的原因。我不应该使用以下行:

ZstdInputStream zstdInputStream= new ZstdInputStream(new   ByteArrayInputStream(zstdBytes));

基本上这是可行的:

byte[] zstdBytes = Zstd.compress(payload.getBytes(StandardCharsets.UTF_8));
InputStream inputStream = new ByteArrayInputStream(zstdBytes);

【讨论】:

    猜你喜欢
    • 2020-01-04
    • 2011-11-12
    • 1970-01-01
    • 2021-10-08
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多