java - BufferedWriter 没有写入 ByteArrayOutputStream

标签 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 有什么问题?

最佳答案

没有问题 - 只是缓冲! :D

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

如果您想查看底层编写器更新,您必须:

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

2) 调用.flush()

3) 调用.close()

4) 如评论中所述,您可以尝试使用资源来隐式关闭:

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

关于java - BufferedWriter 没有写入 ByteArrayOutputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20393150/

相关文章:

java - 使用 mongodb 的 Apache Wicket 表单

java - 什么是NullPointerException,我该如何解决?

java - 如何将URL站点封装成Java对象?

java - 写入 .csv 文件中的新行而不覆盖第一行

java - 为什么 Collectors.toList() 不适用于原始集合?

java - 从 3GP 文件中提取 AMR 数据

java - import javafx无法解决

java - 当路径包含任何空格时,在 Java ist 中加载文件不起作用,例如%20

visual-studio-2010 - 将 RGB 图像转换为 HSI 颜色空间

java - File.length() 与 windows 不同,文件内容仍然相同吗?