在字典中使用java Deflater/Inflater有什么问题
我试着把充气器和放气器与字典一起使用,但它不起作用。当我运行这个简单的测试程序时:在字典中使用java Deflater/Inflater有什么问题,java,zlib,Java,Zlib,我试着把充气器和放气器与字典一起使用,但它不起作用。当我运行这个简单的测试程序时: 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
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)
我做错了什么?谢谢。在设置输入之前先设置充气机字典。此外,您的无限循环将永远运行。你想要像这样的东西
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.setDictionary(abcd);
inf.setInput(buf); // include extra "dummy" byte
while (inf.inflate(buf) != 0) {
// discard
}
assert !inf.needsInput();
assert inf.needsDictionary();
inf.end();
然后它在这里无误地运行。我没有使用streams-我直接使用Deflater/Inflater,因为这是使用字典所必需的。ZIP和GZIP都基于相同的zlib“deflate”算法,这是LZ77的一个变体。谢谢,但这很奇怪。根据,您必须在调用inflate并取回needsDictionary==true之后设置字典。您使用的是静态字典。阅读链接答案中的评论。我还是不明白。为什么在原始代码中,inflate会抛出异常,而不是返回零并通过needsDictionary请求字典返回true?换言之,假设解压代码事先不知道是否有任何字典用于压缩,或者如果有,是哪一个。那么您将如何编写解压缩代码来处理所有可能的情况呢?