我正在尝试使用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(),则只压缩第一个元素,然后编译但没有预期的结果。谢谢你的帮助。
答案 0 :(得分:0)
compresser.finish();
这是因为您正在调用finish()
。删除。