好的,我们来对 BufferedWriter
进行一番彻底的核心源码剖析。它与 BufferedReader
遥相呼应,是 Java I/O 体系中用于高效写入字符数据的关键类。
📝 BufferedWriter 核心源码剖析 (基于 Java 11)
✨ 1. 核心设计与定位
BufferedWriter
同样是一个装饰器(Decorator),它继承自 Writer
抽象类。它的核心作用是包装另一个 Writer
对象(如 FileWriter
或 OutputStreamWriter
),通过引入一个内存缓冲区,将大量零碎的小规模写入操作聚合为少量大规模的块写入操作,从而显著减少对底层数据源(如磁盘文件、网络socket)的物理 I/O 调用次数,极大提升写入效率。
此外,它还提供了一个方便的 newLine()
方法,用于写入与平台无关的行分隔符。
📊 2. 核心成员变量解析
BufferedWriter
的状态由以下几个关键变量控制:
变量名 | 数据类型 | 作用描述 |
---|---|---|
out |
Writer |
被装饰的底层字符输出流对象,所有写入操作最终都委托给它。 |
cb |
char[] |
字符缓冲区,所有要写入的字符首先被追加到这里。 |
nChars |
int |
缓冲区的容量(大小)。 |
nextChar |
int |
指向缓冲区中下一个可写入字符的位置(索引)。可以看作是当前缓冲区中已存字符的计数。 |
lineSeparator |
String |
行分隔符字符串。通过 System.lineSeparator() 获取,保证平台无关性。 |
nextChar
的解读:它总是指向缓冲区中“空闲”位置的起始点。例如,如果nextChar
是 5,意味着cb[0]
到cb[4]
这 5 个位置已经存有字符,下一个字符应该放在cb[5]
。
🏗️ 3. 构造方法
BufferedWriter
提供了两个构造方法:
// 使用默认大小的缓冲区(8192个字符)
public BufferedWriter(Writer out) {
this(out, defaultCharBufferSize);
}
// 使用指定大小的缓冲区
public BufferedWriter(Writer out, int sz) {
super(out); // 调用父类Writer的构造方法,初始化锁对象
if (sz <= 0)
throw new IllegalArgumentException("Buffer size <= 0");
this.out = out;
cb = new char[sz]; // 创建指定大小的字符数组作为缓冲区
nChars = sz; // 记录缓冲区容量
nextChar = 0; // 初始化指针,表示缓冲区为空
// 获取系统相关的行分隔符,例如Linux是"\n",Windows是"\r\n"
lineSeparator = System.lineSeparator();
}
设计意图:与 BufferedReader
一致,遵循装饰器模式。用户操作 BufferedWriter
,而它负责智能地缓冲和管理对底层 Writer
的写入。
⚙️ 4. 核心方法实现原理
✍️ 4.1 write(int c)
方法:写入单个字符
这是最基本的写入操作,揭示了缓冲的核心逻辑。