我遇到了类似的问题。我试图通过本地网络以 8192 字节的块发送一个大文件(〜 709 MB)。我使用 Lz4 压缩/解压缩来减少网络带宽。
因此,假设您正在尝试做类似的事情,这是我的建议:
这是您可以在https://github.com/jpountz/lz4-java 上找到的类似常规示例的 sn-p
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;
}