为什么 BufferedWriter 将数据部分写入文件?

Why BufferedWriter is writing the data into the file partially?

我正在尝试使用以下代码编写 json 文件

        File f = new File("words_3.json");
        if (!f.exists()) {
            f.createNewFile();
        }
        if (fileWriter == null)
            fileWriter = new BufferedWriter(new FileWriter(f));
        while (scanner.hasNext()) {
            String text = scanner.nextLine(); 
                    fileWriter.append(text);
                    System.out.println("writing : "+text);
        }

语句System.out.println()显示终端中的所有文本。

当我检查输出文件时,我看到只写了 1300 行,而有超过 2000 行可用。

您正在写入输出流的数据不能保证立即到达目的地。

BufferedWritter 是一个 so-called high-level 流 它装饰了处理特定数据目的地的基础流,例如 FileWriter并且它们之间可能有更多的流)通过缓冲文本输出并提供 convince-method newLine().

BufferedWritter 维护一个缓冲区一个字符数组),默认大小为8192。当它 变满 时,它会将其分发给底层 low-level 流 。在这种情况下,对于 FileWriter,它将负责将 个字符 编码为 个字节

完成后,JVM 将通过 FileOutputStream因为在底层字符流是建立在字节流之上的).

因此,写入缓冲区的数据将出现在文件中的中:

  • 缓冲区 ;
  • 并且在 关闭后 .

Javadoc 对于方法 close() 说:

Closes the stream, flushing it first.

即在释放资源之前 close() 调用方法 flush() 强制将缓存的数据传递到其目的地。

如果没有异常发生,写入流的所有内容都保证在流关闭时到达目的地。

您也可以在代码中使用 flush()。但它必须非常谨慎地应用。可能当你处理大量关键数据并且有用时,即使部分写入(所以在异常的情况下你会丢失更少的信息).滥用 flush() 会显着降低性能。