我希望有人可以解决我在下面的代码中遇到的问题。
private static String encode(String data) throws IOException {
try (
ByteArrayOutputStream out = new ByteArrayOutputStream();
InputStream is = new ByteArrayInputStream(data.getBytes());
BufferedReader br = new BufferedReader(new InputStreamReader(is));
OutputStreamWriter writer = new OutputStreamWriter(new GZIPOutputStream(out));
) {
char[] charBuffer = new char[data.length()];
while (br.read(charBuffer) != -1) {
writer.write(charBuffer);
}
// writer.close();
return new String(Base64.encodeBase64(out.toByteArray()));
}
}
我的测试值是
This is some text that I can test some base64 encoding with.
I am getting a strange problem with the encoded value
当writer.close被注释掉时,我的输出是
H4sIAAAAAAAAAA==
如果没有评论,我的输出是
H4sIAAAAAAAAACWMzQ2DMBSD70jdwRP0VLED9y7wACuJRJKKZ37GJxTJF/uz/Y3J0eQ1E+IpKJowYLLSvOshozn7D1imOqcScCTF96sbYBmB0p0ZXKuVQPzWOi7M/1b747PjjN2WjRd08DfZcwAAAA==
此第二个输出是正确的值,可以解码回原始值。 据我了解,这个过程如下:
为什么需要关闭编写器以使输出正确?
答案 0 :(得分:0)
因为当我们关闭编写器时它会刷新流。当你不关闭编写器时它不会被刷新(缓冲区只有在它满了或关闭时才自动刷新)。所以你可以通过编写
来明确地做到这一点writer.flush()
答案 1 :(得分:0)
必须告知GZIP输出流何时完成压缩并将结果写入基础流。 close()
隐含地刷新编写器并在GZIP流上调用finish()
。
因此,至少在作者和GZIP流的flush()
或finish()
上调用close()
,或关闭作者,这将完成所有这些并且不会受到任何伤害。