0Pricing
Java Academy · 课时

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 Scanner 读取输入
  2. 读取数字与行
  3. 验证用户输入
  4. BufferedReader 替代方案
← 返回 Java Academy