0

我希望有人可以阐明我在下面的代码中遇到的问题。

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==

第二个输出是正确的值,可以解码回原始值。据我了解,流程如下:

  1. 尝试代码被执行
  2. 返回值被评估和存储
  3. 资源全部关闭
  4. 返回值被返回。

那么为什么需要关闭编写器才能使输出正确呢?

4

2 回答 2

0

必须告知 GZIP 输出流何时完成压缩并将结果写入底层流。close()隐式刷新编写器并调用finish()GZIP 流。

因此,至少调用GZIP 流flush()的 writer 和finish()/ 或close()关闭 writer,这将完成所有这些并且无论如何都不会受到伤害。

于 2014-05-08T07:02:30.923 回答
0

这是因为当我们关闭编写器时,它会刷新流。当您不关闭写入器时,它不会被刷新(缓冲区只有在它满或关闭时才会自动刷新)。所以你可以通过写明确地做到这一点

writer.flush()
于 2014-05-08T06:52:34.010 回答