当前位置: 首页 > 面试题库 >

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

朱高超
2023-03-14
问题内容

以下代码基于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设计的角度来看,这似乎非常直觉且笨拙,因此,如果有更好的选择,请告诉我。



 类似资料:
  • 我正在使用Android应用程序,我想以某种方式打印HashMap的键和值。假设以下是HashMap的内容: 我想以这样一种方式打印HashMap键和值,即字母键首先按字母顺序打印,然后是数字键按升序打印: 我现在做的是: > < li> 获取密钥集并将其保存到数组列表中 使用比较器对数组列表进行排序 使用排序列表打印出地图中的值 这是我的代码: 到目前为止,它还在工作,但是在某些情况下,我没有得

  • 问题内容: 我知道Android 很棒。它使我们能够播放本地文件以及媒体流。而且非常容易使用(例如): 通过调用具有不同参数集的重载,可以设置不同类型的DataSource 。这个函数有一个有趣的原型: 看起来可以用自己的实现完全覆盖。它确实有效: 并在主要代码中: 是的,这很好。但是,如果我尝试音频/ aacp广播流(例如:“ http://111.223.51.8:8005”-它是“ COOL

  • 我正在尝试使用dropw的JDBI探索,我的客户代码如下所示。 并尝试使用以下代码调用 并得到下面的问题 我得到报价问题,因为这是作为字符串传递的。通过这种方式,我试图实现所有查询的公共where子句代码。我的问题是1.如何解决这个问题。2.这是正确的编码方式吗?或者我们可以使用预先准备好的语句。如果是,那么如何。 非常感谢提前:)

  • 我有一个名为LibraryConfig的带有注释的配置属性类。它使用内部类作为属性/配置结构的类型定义。当类是内部类而不是独立类时,我得到“元素[…]“未绑定”错误/异常。为什么会这样?我如何修复它? application.yml 库配置。Java语言

  • 问题内容: 我只是开始看一下Mattt出色的新Alamofire快速联网库,并且不确定如何将其与自定义标头一起使用。 我正在尝试从AFNetworking转换为Alamofire的代码是这样的: 问题答案: 根据官方文档,不建议修改会话配置: 不建议将其用于Authorization或Content- Type标头。而是分别使用URLRequestConvertible和ParameterEnco

  • 我是Gradle/Groovy的新手,所以我可能遗漏了一些显而易见的东西。你能帮忙吗? 我们使用Ivy进行依赖管理。我正在试用Gradle,希望与我们现有的常春藤基础设施集成。通常情况下,这应该是可能的,但我们的常春藤的布局有点特别,而且...我不能让它工作。 这是因为我们的常春藤在布局时考虑了组织的url,例如: 我现在试着把这句话翻译成Gradle: 这当然是失败的,因为“[organizat