好的,我们来详细讲解一下Java中字符输出流(Writer)的底层原理,特别是 flush() 方法。

这背后的核心思想是编码转换缓冲

1. 核心原理:字符 (char) 到 字节 (byte) 的桥梁

首先要明白一个关键点:

因此,字符输出流 (Writer) 的核心职责就是充当一个“桥梁”,它接收Java程序的 char 数据,然后使用一种特定的字符集(Charset,如 UTF-8, GBK) 将这些 char 编码(encode)成 byte,最后再把这些 byte 写到底层的字节输出流 (OutputStream) 中。

这个“桥梁”本身就是 java.io.OutputStreamWriter

// 示例:
// 1. 底层字节流:FileOutputStream,它直接操作文件字节
OutputStream fos = new FileOutputStream("file.txt");

// 2. “桥梁”:OutputStreamWriter,指定用 UTF-8 编码
// 它包装了字节流,负责把 char 转成 byte
Writer writer = new OutputStreamWriter(fos, "UTF-8");

// 3. 写入字符
writer.write('你'); // '你' (char) -> 编码为 -> 0xE4 0xBD 0xA0 (3个 byte)
writer.write('好'); // '好' (char) -> 编码为 -> 0xE5 0xA5 0xBD (3个 byte)

// ...
writer.close();

2. 缓冲机制 (BufferedWriter)

上面的 OutputStreamWriter 已经可以工作了,但效率不高。想象一下,你每调用一次 writer.write('字'),它可能就得:

  1. 接收一个 char
  2. 调用编码器将其转换为几个 byte
  3. 调用底层的 fos.write(byte[])
  4. fos.write() 触发一次系统调用(System Call),让操作系统去写磁盘。

系统调用(切换CPU状态从用户态到内核态)是非常昂贵的操作。如果写一个10000字的文件,就要触发10000次(甚至更多)的系统调用,性能会极差。

为了解决这个问题,Java 提供了 java.io.BufferedWriter

BufferedWriter 是一个装饰器(Decorator),它“包”在另一个 Writer(比如 OutputStreamWriter)的外面。

BufferedWriter 的底层原理:

  1. 内部缓冲区: BufferedWriter 内部维护一个 char 数组(缓冲区),默认大小通常是8192个字符(8KB)。