如何在Java中正确实现LZ4,Snappy或等效压缩技术?

时间:2014-05-19 19:36:30

标签: java compression snappy lz4

我尝试将Java版本的LZ4实现为一种试图从大文本文件中搜索数据的搜索引擎程序。我只是压缩输出流并将其存储到没有名称的txt文件或文件中。但是,我意识到所谓的压缩文件大小没有减小,但它的大小甚至比原始文件大。

最后我不得不求助于zip4j,因为它适用于我。

我想知道如何使用LZ4或Snappy罐来正确压缩/解压缩?

此外,我如何使用此类算法压缩包含许多文件的单个文件夹?

谢谢!

2 个答案:

答案 0 :(得分:4)

我遇到了类似的问题。我试图通过本地网络以8192字节的块发送大文件(~709 MB)。我使用Lz4压缩/解压缩来减少网络带宽。

所以假设你正在尝试做类似的事情,我的建议如下:

这是您在https://github.com/jpountz/lz4-java

上找到的类似常规示例的摘录
private static int decompressedLength;
private static LZ4Factory factory = LZ4Factory.fastestInstance();
private static LZ4Compressor compressor = factory.fastCompressor();

public static byte[] compress(byte[] src, int srcLen) {
    decompressedLength = srcLen;
    int maxCompressedLength = compressor.maxCompressedLength(decompressedLength);
    byte[] compressed = new byte[maxCompressedLength];
    compressor.compress(src, 0, decompressedLength, compressed, 0, maxCompressedLength);
    return compressed;
}

现在,如果按原样返回压缩字节数组,那么它的长度可能会大于原始未压缩数据。

所以你可以按如下方式修改它:

private static int decompressedLength;
private static LZ4Factory factory = LZ4Factory.fastestInstance();
private static LZ4Compressor compressor = factory.fastCompressor();

public static byte[] compress(byte[] src, int srcLen) {
    decompressedLength = srcLen;
    int maxCompressedLength = compressor.maxCompressedLength(decompressedLength);
    byte[] compressed = new byte[maxCompressedLength];
    int compressLen = compressor.compress(src, 0, decompressedLength, compressed, 0, maxCompressedLength);
    byte[] finalCompressedArray = Arrays.copyOf(compressed, compressLen);
    return finalCompressedArray;
}

compressLen 存储实际压缩长度, finalCompressedArray 字节数组(长度为compressLen)存储实际压缩数据。一般来说,它的长度小于压缩字节数组和原始未压缩字节数组的长度

现在您可以按常规方式解压缩 finalCompressedArray 字节数组,如下所示:

private static LZ4FastDecompressor decompressor = factory.fastDecompressor();

public static byte[] decompress(byte[] finalCompressedArray, int decompressedLength) {
    byte[] restored = new byte[decompressedLength];
    restored = decompressor.decompress(finalCompressedArray, decompressedLength);
    return restored;
}

答案 1 :(得分:1)

.jar文件是.zip文件。 zip文件格式不支持LZ4或Snappy。