一行,不一定是一次读出来的

BufReader 像在文件和你的代码之间摆了一个周转箱。底层每次搬一批字节;read_line 再从箱子里寻找换行符。缓冲区边界可以切在任何地方,甚至切进一个汉字的 UTF-8 字节中间。

BUFREAD / BYTE LAB

文件中的 UTF-8 字节

下一批换行 0A

BufReader 内部暂存

还没有搬入字节

交给业务代码的完整行

遇到换行符后才产出
把填充量调小,再逐块读取。你会看到“底层读取次数”和“业务行数”不是一回事。