BufferedWriter没有写入ByteArrayOutputStream

时间:2013-12-05 06:37:01

标签: java java-io

我想将输入流转换为字节数组。我知道我可以使用来自commons-io的IOUtils。但我正在练习java io中的一些基础知识。我使用BufferedReader读取了一个xml文件,并尝试使用BufferedWriter将其写入ByteArrayOutputStream。但它不起作用。

当我直接写入ByteArrayOutputStream时,它正在工作。我的代码有什么问题?

try (InputStream inputStream = getClass().getResourceAsStream(
                "/productInventory.xml");
                ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
                BufferedWriter bufferedWriter = new BufferedWriter(
                        new OutputStreamWriter(arrayOutputStream));
                BufferedReader bufferedReader = new BufferedReader(
                        new InputStreamReader(inputStream));) {
            String line = "";
            while ((line = bufferedReader.readLine()) != null) {

                bufferedWriter.write(line);
            }
            System.out.println(arrayOutputStream.size());
        } catch (IOException e) {
            e.printStackTrace();
        }

当我在循环中包含以下行时,它的工作

arrayOutputStream.write(line.getBytes(), 0, line.getBytes().length);

使用BufferedWriter时有什么问题?

1 个答案:

答案 0 :(得分:5)

没有错 - 它只是缓冲! :d

BufferedWriter的工作原理是将发送到缓冲区中的所有内容过滤到缓冲区中 - 当缓冲区已满,或者当编写器关闭或刷新时(它是一个可关闭的,所以你应该绝对关闭它),它会发送缓冲字符到底层作者。

如果您想要查看基础编写器更新,您必须:

1)填写缓冲区(Java中默认大小为8k)

2)致电.flush()

3)致电.close()

4)正如评论中所提到的,你可以尝试使用资源来隐式关闭:

try (BufferedWriter writer = new BufferedWriter(underlyingWriter)) {
  // doStuff
}