Я точно не знаю внутреннюю работу алгоритма zlib, но, основываясь на моем понимании DictGZIPOutputStream
, когда вы вызываете метод write (), после его записи он обновит свой crc для этого байтового массива. Поэтому, если вы снова вызовете updateCRC()
в своем коде, то все станет неправильно, так как crc обновляется дважды. Затем, когда выполняется gzip -d, в результате двух предыдущих обновлений crc, gzip будет выдавать сообщение «неверные сжатые данные - ошибка crc»
Я также заметил, что вы не закрывали компрессор после его использования. Когда я выполнил код, вставленный выше, он выдал ошибку «gzip: stdin: неожиданный конец файла». Поэтому всегда обязательно сбрасывайте метод и метод close вызывается в конце. С учетом сказанного, у меня есть следующее,
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.GZIPOutputStream;
public class Dict
{
protected static final int BLOCK_SIZE = 128;
protected static final int DICT_DIZE = 32;
public static void main(String[] args)
{
InputStream stdinBytes = System.in;
byte[] input = new byte[BLOCK_SIZE];
byte[] dict = new byte[DICT_DIZE];
int bytesRead = 0;
try
{
DictGZIPOutputStream compressor = new DictGZIPOutputStream(System.out);
bytesRead = stdinBytes.read(input, 0, BLOCK_SIZE);
if (bytesRead >= DICT_DIZE)
{
System.arraycopy(input, 0, dict, 0, DICT_DIZE);
}
do
{
compressor.write(input, 0, bytesRead);
if (bytesRead == BLOCK_SIZE)
{
System.arraycopy(input, BLOCK_SIZE-1, dict, 0, DICT_DIZE);
compressor.setDictionary(dict);
}
bytesRead = stdinBytes.read(input, 0, BLOCK_SIZE);
}
while (bytesRead > 0);
compressor.flush();
compressor.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
public static class DictGZIPOutputStream extends GZIPOutputStream
{
public DictGZIPOutputStream(OutputStream out) throws IOException
{
super(out);
}
public void setDictionary(byte[] b)
{
def.setDictionary(b);
}
public void updateCRC(byte[] input)
{
crc.update(input);
}
}
}
Результат теста на консоли.
$ cat file.txt
hello world, how are you?1e3djw
hello world, how are you?1e3djw adfa asdfas
$ cat file.txt | java Dict | gzip -d | cmp file.txt ; echo $?
0