bufferedreader按行读取大文本文件需四点:指定utf-8编码防乱码,设64kb缓冲区提效,用try-with-resources自动关流,逐行处理不缓存全文。

用 BufferedReader 按行读取大文本文件,核心是“流式处理 + 合理缓冲 + 正确关流”,不把整份文件加载进内存,就能稳定处理 GB 级日志、CSV 或 JSONL 文件。
必须指定字符编码,避免乱码
系统默认编码不可靠,尤其在跨平台或含中文的文件中。务必显式传入 StandardCharsets.UTF_8(或其他实际编码):
- 别用
new FileReader("file.txt")—— 它依赖系统默认编码,Windows 和 Linux 表现不同 - 改用
new InputStreamReader(new FileInputStream(...), StandardCharsets.UTF_8) - Java 11+ 可直接用
Files.newBufferedReader(Paths.get("file.txt"), StandardCharsets.UTF_8)
设置合适缓冲区大小,提升 I/O 效率
BufferedReader 默认缓冲区仅 8KB,对大文件读取频繁触发底层系统调用。建议设为 64KB(65536 字节):
- 太大(如 1MB)不会明显提速,反而浪费堆空间
- 太小(如 1KB)导致 readLine() 频繁从磁盘拉数据,性能下降
- 构造时传入:
new BufferedReader(reader, 64 * 1024)
用 try-with-resources 自动释放资源
BufferedReader 包装了底层流(FileInputStream / InputStreamReader),必须关闭,否则可能泄漏文件句柄。try-with-resources 是最简、最安全的方式:
- 无需手动写 finally 块和三重 close()
- 即使处理中抛异常,br 也会被自动 close()
- 示例:
try (BufferedReader br = new BufferedReader(...)) { ... }
逐行处理,不累积行数据到集合
关键不是“读得快”,而是“不爆内存”。每行处理完就丢弃引用:
- 禁止使用
Files.readAllLines()或FileUtils.readLines()—— 它们返回List<string></string>,几百万行就 OOM - 坚持用
while ((line = br.readLine()) != null)循环 - 处理逻辑写在循环体内,例如解析字段、过滤关键字、写入数据库等,不要 add 到 ArrayList
不复杂但容易忽略:编码、缓冲大小、自动关流、不缓存全文 —— 这四点齐备,BufferedReader 就能稳稳扛住 10GB 文本文件。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











