在几个输入上使用deflater时出错

时间:2017-06-06 23:15:47

标签: java encoding compression

我正在尝试使用Deflater类来编码文本文件。困难在于我不想编码整个文本文件,而只是每行的子字符串。我的文本文件如下所示:

ELEMENT(1):{dataToEncode}
ELEMENT(2):{dataToEncode}

我想返回一个HashMap,其中key是元素ID(Integer),哪个值是对应于该行部分的压缩字节到括号中。我想对所有行使用相同的字典(不是预设),因为它们的内容非常接近。此外,最终,算法必须在流上工作,即新行将被写入输入文本文件中,并且应该在添加它们之后立即压缩。

我有一个版本,如果我重置deflater,但我认为它在每行编码后也重置字典,这不像保持相同的字典一样有效,因为元素上的注释非常相似。

    public static HashMap< Integer, byte[]> encoding(String textfile) throws FileNotFoundException, UnsupportedEncodingException {
    HashMap< Integer, byte[]> elements = new HashMap< Integer, byte[]>();
    Deflater compresser = new Deflater(Deflater.BEST_COMPRESSION);
    File file = new File(textfile + ".txt");
    Scanner sc = new Scanner(file);
    while (sc.hasNextLine()) {
        String toCompress = sc.nextLine();

        if (toCompress.substring(0, 7).equals("ELEMENT")) {
            String infoToCompress = toCompress.substring(toCompress.indexOf('{') + 1, toCompress.indexOf('}'));
            byte [] input = infoToCompress.getBytes("UTF-8");
            byte [] output = new byte[input.length + 100];
            compresser.setInput(input);
            compresser.finish();
            int compressedDataLength = compresser.deflate(output);              
            Integer element = Integer.parseInt(toCompress.substring(toCompress.indexOf('(')+1, toCompress.indexOf(")")));
            elements.put(element, output);;
            compresser.reset();
        }
    }
    compresser.end();
    sc.close();
    return elements;
}

如果我不使用compresser.reset(),则只压缩第一个元素,然后编译但没有预期的结果。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

compresser.finish();

这是因为您正在调用finish()。删除。