我曾经遇到过相似的问题。我试图将一个大文件(约709 MB)分块以每个8192字节的速度通过本地网络发送。为了减少网络带宽,我使用了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)存储了实际压缩后的数据。一般来说,它的长度比compressed 字节数组和原始的 uncompressed 字节数组都要小。
现在,您可以按照以下常规方式对 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;
}