BufferedReader 替代方案
更快地读取控制台输入
BufferedReader 替代方案 是 CoddyKit 上的免费 Java Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。
更快的读取器
Scanner 使用方便,但处理大量输入时相对较慢。对于高吞吐量的读取,来自 java.io 的 BufferedReader 要快得多,因为它会一次读取大块数据。
创建 BufferedReader
在 BufferedReader 中包装一个围绕 System.in 的 InputStreamReader。这里使用 StringReader,这样示例无需用户输入即可运行。
import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new StringReader("Hello"));
System.out.println(reader.readLine());
reader.close();
}
}readLine 返回 String
readLine() 会将一整行读取为 String,但不包含行终止符。与 Scanner 不同,它始终返回文本,因此需要由您自行解析数值。
import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new StringReader("first\nsecond"));
System.out.println(reader.readLine());
System.out.println(reader.readLine());
reader.close();
}
}输入结束时返回空值
没有更多输入时,readLine() 会返回 null。这是停止读取的信号。
import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new StringReader("one line"));
System.out.println(reader.readLine());
System.out.println(reader.readLine());
reader.close();
}
}读取所有行
当 readLine() 不为 null 时循环,以处理输入中的每一行。
import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new StringReader("a\nb\nc"));
String line;
while ((line = reader.readLine()) != null) {
System.out.println("> " + line);
}
reader.close();
}
}自行解析数值
由于 readLine 提供的是文本,需要数值时请使用 Integer.parseInt 将其转换。
import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new StringReader("42"));
int n = Integer.parseInt(reader.readLine().trim());
System.out.println(n * 2);
reader.close();
}
}将一行拆分为令牌
要从一行中读取多个数值,请使用 split 拆分该行,然后解析每个部分。
import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new StringReader("10 20 30"));
String[] parts = reader.readLine().split(" ");
int sum = 0;
for (String p : parts) {
sum += Integer.parseInt(p);
}
System.out.println(sum);
reader.close();
}
}受检异常
readLine 声明会抛出受检的 IOException,因此您必须声明 throws IOException,或将调用放入 try-catch 中。Scanner 不要求这样做。
import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
try {
BufferedReader reader = new BufferedReader(new StringReader("data"));
System.out.println(reader.readLine());
reader.close();
} catch (IOException e) {
System.out.println("Read error");
}
}
}try-with-resources
请使用 try-with-resources,这样即使发生异常,读取器也会自动关闭。
import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
try (BufferedReader reader = new BufferedReader(new StringReader("auto-closed"))) {
System.out.println(reader.readLine());
}
}
}真实的 System.in 示例
对于真实的键盘输入,请包装 System.in。在本地运行此程序,输入一行内容,然后按 Enter 键。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter text: ");
String input = reader.readLine();
System.out.println("You typed: " + input);
}
}Scanner 与 BufferedReader
如果追求便利和简单的数值解析,请选择 Scanner。如果处理大量输入并追求速度,请选择 BufferedReader,但需要自行解析并处理 IOException。
快速检查
测试您对 BufferedReader 的理解。
回顾
您已经学会了 BufferedReader 这一替代方案:
- 先将
System.in包装在InputStreamReader中,再包装在BufferedReader中 readLine()返回一整行,或在输入结束时返回null- 使用
Integer.parseInt和split自行解析数值 - 它会抛出受检的
IOException,因此必须处理或声明该异常 - 对于规模较大且对性能要求高的输入,优先使用它而不是 Scanner
常见问题解答
「BufferedReader 替代方案」课时是免费的吗?
是的 — 「BufferedReader 替代方案」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。
「BufferedReader 替代方案」这节课中我会学到什么?
更快地读取控制台输入 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Java Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「BufferedReader 替代方案」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Java Academy 课中编写并运行代码吗?
能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 使用 Scanner 读取输入
- 读取数字与行
- 验证用户输入
- BufferedReader 替代方案