bufferedreader按行读取的核心是readline()方法,它内部缓冲优化、一次读取整行、末尾返回null;需用try-with-resources关闭,确保底层reader指定正确编码(如utf-8),避免低效操作。

BufferedReader 按行读取字符流的核心是 readLine() 方法,它内部已做缓冲优化,无需手动处理字节数组或循环拼接,直接调用即可高效获取每行内容。
使用 readLine() 逐行读取(推荐)
readLine() 一次读取一整行(不包含换行符),返回 String;到达流末尾时返回 null。它底层复用内部字符缓冲区,避免频繁 IO 调用,比逐字符读取快得多。
典型写法:
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
// 处理每一行
System.out.println(line);
}
}- 务必用 try-with-resources 自动关闭,防止资源泄漏
- 不要在循环条件里重复 new String(reader.readLine())——readLine() 已返回新字符串
- 若需保留换行符,可手动追加 "\n" 或 "\r\n"(但通常不需要)
注意编码与换行符兼容性
BufferedReader 本身不指定编码,其行为依赖于包装的 Reader。若源数据含中文或特殊字符,必须确保底层 Reader 使用正确编码(如 UTF-8)。
- 错误写法:
new FileReader("utf8.txt")(默认使用系统编码,Windows 上可能是 GBK) - 正确写法:
new BufferedReader(new InputStreamReader(new FileInputStream("utf8.txt"), StandardCharsets.UTF_8)) - readLine() 可识别 \n、\r、\r\n 三种换行符,无需额外适配
避免常见低效操作
以下做法会显著降低效率或引发问题:
- 用
reader.read() == -1判断 EOF 后再调用 readLine() —— 多余且破坏流位置 - 在循环内反复创建 BufferedReader(如每次读一行都 new 一个)—— 缓冲失效,退化为无缓冲读取
- 用
readLine().toCharArray()再逐字符处理 —— 若只需按行处理,没必要拆成字符 - 对小文件也强行用 Scanner —— Scanner 功能重、正则解析开销大,纯按行读取不如 BufferedReader 直接
需要处理超长行或内存敏感场景?
readLine() 默认缓冲区大小为 8192 字符,足够应对绝大多数文本。如果某行远超此长度(如单行几 MB 的日志或 Base64),可能触发多次数组扩容。
- 可显式指定更大缓冲区:
new BufferedReader(reader, 64 * 1024) - 极端情况(如流式解析超大 CSV 行),考虑用 CharArrayReader + 手动扫描,但属少数需求
- 一般业务代码中,保持默认缓冲区即可,不必过早优化
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











