使用 BufferedReader 替代 Scanner 可提升 Java 算法题输入速度 2–10 倍,核心是用 readLine() 配合手动解析(split 或 StringTokenizer),需显式指定 UTF-8 编码,并注意判空、复用对象及规范资源管理。

直接用 BufferedReader 替代 Scanner 是 Java 算法题提速最有效、最常用的手法之一。它不改变逻辑,只替换输入方式,就能让读取速度提升 2–10 倍,尤其在输入规模达 10⁴ 行以上时,效果立竿见影。
核心替换逻辑:readLine() + 手动解析
BufferedReader 不提供 nextInt() 这类方法,但它只做一件事:高效读取一整行字符串。后续解析交给开发者——这正是性能提升的关键。
- 用
br.readLine()获取整行(如"123 456 789") - 用
split(" ")或StringTokenizer拆分成字符串数组 - 对每个字符串调用
Integer.parseInt()、Long.parseLong()等转换
标准初始化写法(含编码安全)
必须显式指定字符编码,否则中文或特殊环境易乱码。推荐写法:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8));- 不要用
new FileReader(System.in)—— 编译不通过,且不支持编码设置 - 竞赛平台默认 UTF-8,但显式声明可避免本地 Windows 控制台(GBK)下出错
常见输入模式的对应写法
覆盖算法题 95% 的输入场景:
立即学习“Java免费学习笔记(深入)”;
-
单个整数:
int n = Integer.parseInt(br.readLine().trim()); -
一行多个整数(空格分隔):
String[] parts = br.readLine().split("\s+"); int a = Integer.parseInt(parts[0]); int b = Integer.parseInt(parts[1]); -
逐行读入字符串(含空格):
String s = br.readLine(); // 直接获取整行,不跳过空白 -
高性能拆分(百万级 token):用
StringTokenizer st = new StringTokenizer(br.readLine());,比split()更快且不触发正则引擎
避坑要点:别踩 Scanner 的老坑,也别掉进新坑
BufferedReader 没有状态陷阱,但仍有几个细节影响稳定性和速度:
- 每次
readLine()返回可能为null(流结束),循环中需判空,不能无条件解析 - 避免在循环内反复创建
StringTokenizer或调用split()——对象分配虽小,但百万次会拖慢 GC - 不需要
hasNextLine()这类预读判断;若需非阻塞检测,用br.ready()(轻量级) - 关闭资源非必须(System.in 不需要 close),但加
try-with-resources更规范



















