如何在Java中正确实现LZ4、Snappy或等效压缩技术?
我曾尝试将Java版本的LZ4实现到一个搜索引擎类程序中,该程序试图从大型文本文件中搜索数据。我只是将outputstream压缩并将其存储到txt文件或没有名称的文件中。然而,我意识到被压缩的文件并没有缩小大小,但它甚至比原始文件更大 最后,我不得不求助于zip4j,因为它对我有效 我想知道如何使用LZ4或Snappy的JAR正确压缩/解压缩 此外,我如何使用这些算法来压缩一个包含许多文件的文件夹如何在Java中正确实现LZ4、Snappy或等效压缩技术?,java,compression,snappy,lz4,Java,Compression,Snappy,Lz4,我曾尝试将Java版本的LZ4实现到一个搜索引擎类程序中,该程序试图从大型文本文件中搜索数据。我只是将outputstream压缩并将其存储到txt文件或没有名称的文件中。然而,我意识到被压缩的文件并没有缩小大小,但它甚至比原始文件更大 最后,我不得不求助于zip4j,因为它对我有效 我想知道如何使用LZ4或Snappy的JAR正确压缩/解压缩 此外,我如何使用这些算法来压缩一个包含许多文件的文件夹 谢谢 A.jar文件是一个.zip文件。zip文件格式不支持LZ4或Snappy。我遇到了类似的
谢谢 A
.jar
文件是一个.zip
文件。zip文件格式不支持LZ4或Snappy。我遇到了类似的问题。我试图通过本地网络发送一个大文件(~709 MB),文件大小为8192字节。我使用Lz4压缩/解压缩来减少网络带宽
因此,假设您正在尝试做类似的事情,下面是我的建议:
下面是您可以在上找到的类似常规示例的片段
现在,如果按原样返回压缩的字节数组,则它的长度很可能大于原始的未压缩的数据
因此,您可以按如下方式对其进行修改:
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字节数组(长度压缩)存储实际压缩数据。它的长度通常小于压缩的字节数组和原始的未压缩的字节数组的长度
现在,您可以按如下常规方式解压缩FinalCompressedDarray字节数组:
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;
}
哎呀,问错了P我的意思是如何使用LZ4或Snappy压缩大型文本文件?您尝试了哪些不起作用的方法?从概念上讲,您只需使用提供压缩的OutputStream包装FileOutputStream,然后写入该流。如果您正在编写文本,您可能希望使用OutputStreamWriter或PrintWriter将其包装起来。很抱歉这么晚才确认@Ankit-如果我不知道解压后字节数组的大小,解压长度是多少?
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;
}