2

我正在尝试使用 java-lzo 库解压缩压缩字节数组。我正在关注这个参考

我在 pom.xml中添加了以下maven 依赖项-

<dependency>
        <groupId>org.anarres.lzo</groupId>
        <artifactId>lzo-core</artifactId>
        <version>1.0.5</version>
</dependency>

我创建了一种方法,它接受 lzo 压缩字节数组和目标字节数组长度作为参数。

程序 :

private byte[] decompress(byte[] src, int len) {
    ByteArrayInputStream input = new ByteArrayInputStream(src);
    ByteArrayOutputStream out = new ByteArrayOutputStream();

    LzoAlgorithm algorithm = LzoAlgorithm.LZO1X;
    lzo_uintp lzo = new lzo_uintp(len);
    LzoDecompressor decompressor = LzoLibrary.getInstance().newDecompressor(algorithm, null);
    LzoInputStream stream = new LzoInputStream(input, decompressor);

    try {
        int data = stream.read();
        while (data != -1) {
            out.write(data);
            data = stream.read();
        }
        out.flush();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    return out.toByteArray();
}

我被卡住了,因为stream.read() 总是返回一个 "-1"。我检查了输入数组,它充满了数据。此外,我使用 stream.available() 方法进行了检查,但在我的情况下,此方法也始终返回“0”。但是,如果我像 input.available() 一样检查 InputStream,则返回值是数组的长度。

错误是一样的,就像我说它返回“-1” -

java.io.EOFException
at org.anarres.lzo.LzoInputStream.readBytes(LzoInputStream.java:183)
at org.anarres.lzo.LzoInputStream.readBlock(LzoInputStream.java:132)
at org.anarres.lzo.LzoInputStream.fill(LzoInputStream.java:119)
at org.anarres.lzo.LzoInputStream.read(LzoInputStream.java:90)

那么,在初始化 LzoInputStream 时我错了,或者在那之后我需要做些什么?任何建议将不胜感激!

4

2 回答 2

0

请确保在压缩过程中刷新并关闭 lzo 流。

于 2017-07-30T10:48:25.430 回答
0

对于.lzo文件格式,您应该首先读取标题信息,然后将其传递给LzoInputStream. 然后您可以读取实际数据,直到达到 eof。

我猜前 37 个字节是标头相关信息,压缩算法信息在第 16 个字节中可用。LZO 标头格式记录在https://gist.github.com/jledet/1333896

于 2020-06-22T13:49:28.237 回答