【发布时间】:2015-02-04 03:13:31
【问题描述】:
我正在尝试将Inflater 和Deflater 与字典一起使用,但它不起作用。当我运行这个简单的测试程序时:
import java.io.*;
import java.util.*;
import java.util.zip.*;
public class DictTest {
public static void main(String[] args) throws Exception {
final int level = 9;
final boolean nowrap = true;
// compress
final Deflater def = new Deflater(level, nowrap);
final byte[] abcd = new byte[] { 0x41, 0x42, 0x43, 0x44 };
def.setDictionary(abcd);
def.setInput(abcd);
def.finish();
final byte[] buf = new byte[1024];
final int nbytes = def.deflate(buf);
assert def.finished();
def.end();
// decompress
final Inflater inf = new Inflater(nowrap);
inf.setInput(buf, 0, nbytes + 1); // include extra "dummy" byte
while (true) {
while (inf.inflate(buf) != 0) {
// discard
}
assert !inf.needsInput();
if (inf.finished())
break;
assert inf.needsDictionary();
inf.setDictionary(abcd);
continue;
}
inf.end();
}
}
我得到了这个例外:
$ javac DictTest.java && java -ea DictTest
Exception in thread "main" java.util.zip.DataFormatException: invalid distance too far back
at java.util.zip.Inflater.inflateBytes(Native Method)
at java.util.zip.Inflater.inflate(Inflater.java:259)
at java.util.zip.Inflater.inflate(Inflater.java:280)
at DictTest.main(DictTest.java:27)
我做错了什么?谢谢。
【问题讨论】:
-
我没有使用流 - 我直接使用 Deflater/Inflater,因为这是使用字典所必需的。 ZIP 和 GZIP 都基于相同的 zlib 'deflate' 算法,它是 LZ77 的变体。见en.wikipedia.org/wiki/Zlib#Algorithm