【1.JDK底层源码剖析】3.2BufferedWriter核心源码剖析

好的,我们来对 BufferedWriter 进行一番彻底的核心源码剖析。它与 BufferedReader 遥相呼应,是 Java I/O 体系中用于高效写入字符数据的关键类。

📝 BufferedWriter 核心源码剖析 (基于 Java 11)

✨ 1. 核心设计与定位

BufferedWriter 同样是一个装饰器(Decorator),它继承自 Writer 抽象类。它的核心作用是包装另一个 Writer 对象(如 FileWriterOutputStreamWriter),通过引入一个内存缓冲区,将大量零碎的小规模写入操作聚合为少量大规模的块写入操作,从而显著减少对底层数据源(如磁盘文件、网络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) 方法:写入单个字符

这是最基本的写入操作,揭示了缓冲的核心逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值