如何使用java-lzo库解压缩lzo字节数组?

时间:2017-07-30 10:30:06

标签: java maven lzo

我尝试使用java-lzo库解压缩压缩字节数组。我跟随this reference

我在 maven依赖下面添加了pom.xml -

<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()始终返回&#34; -1&#34; 。我检查了输入数组,它充满了数据。此外,我使用stream.available()方法检查,但此方法也始终返回&#34; 0&#34;在我的情况下。但是如果我检查InputStream就像input.available()那么返回值是数组的长度。

错误就像我说它正在返回&#34; -1&#34; -

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时我错了或之后我需要做点什么?任何建议将不胜感激!

2 个答案:

答案 0 :(得分:0)

请确保在压缩过程中冲洗并关闭lzo流。

答案 1 :(得分:0)

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

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