gpt4 book ai didi

java - 如何在 Java 中正确实现 LZ4、Snappy 或等效的压缩技术?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:46:55 26 4
gpt4 key购买 nike

我已经尝试将 Java 版本的 LZ4 实现到搜索引擎类程序中,试图从大型文本文件中搜索数据。我只是简单的压缩了outputstream,存成txt文件或者没有名字的文件。然而,我意识到所谓的压缩文件并没有减少大小,反而比原始文件更大。

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

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

另外,如何使用这样的算法来压缩包含多个文件的单个文件夹?

谢谢!

最佳答案

我遇到了类似的问题。我试图通过本地网络以 8192 字节的 block 发送一个大文件(~ 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;
}

关于java - 如何在 Java 中正确实现 LZ4、Snappy 或等效的压缩技术?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23745827/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com