gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:07:29 24 4
gpt4 key购买 nike

以下代码基于 javadocs for 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。之后你可以设置字典并再次调用 inflate。

修改后的代码如下:

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 设计的角度来看,这似乎非常反直觉和笨拙,所以如果有更好的选择,请赐教。

关于java - 将 Java Deflater/Inflater 与自定义字典一起使用会导致 IllegalArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5655740/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com