Я столкнулся с похожей проблемой. Я пытался отправить большой файл (~ 709 МБ) по локальной сети кусками по 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) хранит фактические сжатые данные. Его длина, как правило, меньше длины сжатого байтового массива и исходного несжатого байтового массива.
Теперь вы можете распаковать массив байтов 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;
}
person
Ankit
schedule
03.09.2014