0Pricing
Java Academy · 课时

为什么使用 BufferedReader

带缓冲与不带缓冲的读取

为什么使用 BufferedReader 是 CoddyKit 上的免费 Java Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。

在 Java 中读取输入

大多数实际程序都需要从用户那里获取输入:姓名、数字或命令。Java 提供了多种读取输入的方式,其中最常见且高效的方式之一是 BufferedReader。

本课将帮助您了解 BufferedReader 存在的原因,以及应在何时使用它。

输入从何而来

您在控制台中输入内容时,文本会通过 System.in 流入程序。这是一个低级的字节流——它提供的是原始字节,而不是易于处理的文本。

为了将这些字节转换为可读字符和完整的行,我们会使用辅助类包装 System.in。BufferedReader 就是让这一过程变得简单的包装器。

“缓冲”是什么意思

从键盘或文件中一次读取一个字节的速度很慢。缓冲区是一块可以同时存放许多字符的内存。

BufferedReader 会一次读入大块数据填满缓冲区,然后快速将数据交给您。访问底层流的次数更少,意味着性能更好,尤其是在输入量较大时。

两层结构

BufferedReader 不能直接读取 System.in,因为该流提供的是字节。我们首先用 InputStreamReader 包装它,将字节转换为字符。

  • System.in → 字节
  • InputStreamReader → 字符
  • BufferedReader → 带缓冲的行
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);

经典单行写法

几乎所有读取控制台输入的 Java 程序中,您都会看到这一行代码。它在一条语句中串联了两个包装器。

请记住:内部的 InputStreamReader 负责将字节转换为字符,外部的 BufferedReader 则添加缓冲功能以及方便的 readLine() 方法。

BufferedReader br =
    new BufferedReader(new InputStreamReader(System.in));

必需的导入

这些类位于 java.io 包中,因此您必须在文件顶部导入它们。

读取输入可能会失败,因此相关方法会抛出 IOException——您也需要导入或处理它,稍后我们会介绍这一点。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

BufferedReader 与 Scanner

初学者通常会先接触 Scanner。它更易于使用(可以直接解析数字),但速度较慢。

  • Scanner:解析简单,但额外开销较大。
  • BufferedReader:速度更快,可以读取完整的行,但需要您自行解析数字。

对于大量输入或竞赛编程,BufferedReader 的速度更有优势。

读取完整的一行

核心方法是 readLine()。它会读取用户输入的所有内容,直到用户按下回车键,并将其作为 String 返回(不包含换行符)。

如果没有更多输入,readLine() 会返回 null。我们将在下一课中详细探讨这一点。

String name = br.readLine();
System.out.println("Hello, " + name);

完整的读取程序

下面是一个完整的程序。它读取一行内容并向用户打招呼。请注意 main 上的 throws IOException——在学习阶段,这是一种让输入错误向上传递的快捷方式。

此代码片段会等待键盘输入,因此无法在这里自动运行,但它是有效的 Java 代码。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br =
            new BufferedReader(new InputStreamReader(System.in));
        String name = br.readLine();
        System.out.println("Hi " + name);
    }
}

无需输入也能验证其正常工作

为了验证这些包装器确实存在且能够编译,下面提供了一个可运行的版本。它不会读取任何内容,只会确认对象已创建。

在实际应用程序中,您会调用 readLine(),但这个版本会打印一条消息,因此您现在就可以运行它。

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) {
        BufferedReader br =
            new BufferedReader(new InputStreamReader(System.in));
        System.out.println("BufferedReader is ready!");
    }
}

何时使用 BufferedReader

在以下情况下,请使用 BufferedReader:

  • 读取许多行或较大的文件;
  • 关注运行速度;
  • 需要简单的逐行文本处理。

如果您希望快速解析数字且输入量较小,则可以改用 Scanner。两者都有效——请选择合适的工具。

快速检查

检查您对 BufferedReader 结构的理解。

回顾

您已经了解到,System.in 是一个字节流,先由 InputStreamReader 包装(将字节转换为字符),再由 BufferedReader 包装(提供缓冲功能和 readLine())。

缓冲可以提升性能,而 BufferedReader 特别适合处理大量输入或按行读取的输入。下一步:详细了解如何读取行。

常见问题解答

「为什么使用 BufferedReader」课时是免费的吗?

是的 — 「为什么使用 BufferedReader」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。

「为什么使用 BufferedReader」这节课中我会学到什么?

带缓冲与不带缓冲的读取 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Java Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「为什么使用 BufferedReader」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Java Academy 课中编写并运行代码吗?

能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 为什么使用 BufferedReader
  2. 读取行
  3. 从输入中解析数字
  4. 安全关闭流
← 返回 Java Academy