在字典中使用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?换言之,假设解压代码事先不知道是否有任何字典用于压缩,或者如果有,是哪一个。那么您将如何编写解压缩代码来处理所有可能的情况呢?