bufferedwriter更快是因为它用8192字节缓冲区批量写入,减少系统调用;而system.out.println每行都触发一次i/o,实测快5–10倍,需用outputstreamwriter(system.out)包装、指定utf-8编码、调用newline()和flush()。

在算法题中,尤其是输入输出量大的场景(比如处理 10⁵ 级别数据),用 BufferedWriter 替代 System.out.println 能显著提速——核心原因是减少系统调用次数,避免每行都触发一次 I/O。
为什么 BufferedWriter 更快
System.out.println 每次调用都会直接写入底层字节流,相当于一次系统调用;而 BufferedWriter 默认使用 8192 字节缓冲区,把多行内容暂存在内存里,等缓冲区满、显式 flush() 或关闭时才批量写入 stdout。实测写 10 万行整数,BufferedWriter 通常比 System.out.println 快 5–10 倍。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
标准写法与关键细节
- 必须包装
OutputStreamWriter(System.out),不能直接用FileWriter(它不支持指定编码,且不能写到控制台) - 显式指定
StandardCharsets.UTF_8编码,避免平台默认编码导致乱码或隐式转换开销 - 换行统一用
bw.newLine(),它自动适配System.lineSeparator()(Windows 是\r\n,Linux/macOS 是\n) - 写完必须调用
bw.flush()—— JVM 退出不会自动帮你刷缓冲区,漏掉这步会导致最后一部分输出丢失
典型模板代码(ACM/LeetCode 风格)
以下是最常用、最稳妥的写法:
import java.io.*;
import java.nio.charset.StandardCharsets;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(System.out, StandardCharsets.UTF_8)
);
int n = Integer.parseInt(br.readLine());
for (int i = 0; i
<h3>常见误区与避坑点</h3>
- 不要混用
System.out.println和BufferedWriter:输出顺序可能错乱,因为两者缓冲独立 - 不要在循环里拼接大字符串再一次性
write:既浪费内存,又失去缓冲优势;应逐行write + newLine - 避免用
bw.append(str).append("\n"):append()内部会反复检查容量,性能略低于write() - 不用
try-with-resources包裹bw到System.out:虽然语法合法,但close()会关闭System.out,后续其他输出会失败;只flush()即可
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










