将Java Deflater / Inflater与自定义词典一起使用会导致IllegalArgumentException

|| 以下代码基于javadocs.java.util.zip.Deflater中给出的示例。我所做的唯一更改是创建一个称为dict的字节数组,然后使用setDictionary(byte [])方法在Deflater和Inflater实例上设置字典。 我看到的问题是,当我使用与Deflater所使用的数组完全相同的数组调用Inflater.setDictionary()时,会收到IllegalArgumentException。 这是有问题的代码:
import java.util.zip.Deflater;
import java.util.zip.Inflater;

public class DeflateWithDictionary {
    public static void main(String[] args) throws Exception {
        String inputString = \"blahblahblahblahblah??\";
        byte[] input = inputString.getBytes(\"UTF-8\");
        byte[] dict = \"blah\".getBytes(\"UTF-8\");

        // Compress the bytes
        byte[] output = new byte[100];
        Deflater compresser = new Deflater();
        compresser.setInput(input);
        compresser.setDictionary(dict);
        compresser.finish();
        int compressedDataLength = compresser.deflate(output);

        // Decompress the bytes
        Inflater decompresser = new Inflater();
        decompresser.setInput(output, 0, compressedDataLength);
        decompresser.setDictionary(dict);  //IllegalArgumentExeption thrown here
        byte[] result = new byte[100];
        int resultLength = decompresser.inflate(result);
        decompresser.end();

        // Decode the bytes into a String
        String outputString = new String(result, 0, resultLength, \"UTF-8\");
        System.out.println(\"Decompressed String: \" + outputString);
    }
}
如果我尝试不设置字典就缩小相同的压缩字节,则不会出现任何错误,但返回的结果是零字节。 为了在Deflater / Inflater中使用自定义词典,我需要做些特别的事情吗?     
已邀请:
实际上,我在提出问题时就想出了这一点,但我认为无论如何我应该提出问题,以便其他人可以从我的奋斗中受益。 事实证明,您必须在设置输入之后但在设置字典之前调用inflate()一次。返回的值将为0,然后对needsDictionary()的调用将返回true。之后,您可以设置字典并再次调用充气。 修改后的代码如下:
import java.util.zip.Deflater;
import java.util.zip.Inflater;

public class DeflateWithDictionary {
    public static void main(String[] args) throws Exception {
        String inputString = \"blahblahblahblahblah??\";
        byte[] input = inputString.getBytes(\"UTF-8\");
        byte[] dict = \"blah\".getBytes(\"UTF-8\");

        // Compress the bytes
        byte[] output = new byte[100];
        Deflater compresser = new Deflater();
        compresser.setInput(input);
        compresser.setDictionary(dict);
        compresser.finish();
        int compressedDataLength = compresser.deflate(output);

        // Decompress the bytes
        Inflater decompresser = new Inflater();
        decompresser.setInput(output, 0, compressedDataLength);
        byte[] result = new byte[100];
        decompresser.inflate(result);
        decompresser.setDictionary(dict);
        int resultLength = decompresser.inflate(result);
        decompresser.end();

        // Decode the bytes into a String
        String outputString = new String(result, 0, resultLength, \"UTF-8\");
        System.out.println(\"Decompressed String: \" + outputString);
    }
}
从API设计的角度来看,这似乎非常直觉且笨拙,因此,如果有更好的选择,请告诉我。     

要回复问题请先登录注册