You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何调用BufferedReader的read()方法5次却无法输入5个数字?

问题分析与解决方案:BufferedReader.read()读取数字不符合预期

嘿,我来帮你理清这个问题——你遇到的情况其实是对BufferedReader.read()方法的行为理解有偏差啦!

为什么输入1 2 3程序就结束了?

核心原因是:read()方法每次读取的是单个Unicode字符,而不是你以为的“一个完整数字”。当你输入1 2 3时,实际传入输入流的字符序列是:'1'、' '(空格)、'2'、' '(空格)、'3'——刚好5个字符!所以你调用5次read()就把这些字符全部读完了,程序自然就退出了。

简单说,空格和换行符这些分隔符,在read()眼里和数字字符是平等的,都会被当作一个独立的读取单位。

怎么解决?这里给你几个方案:

方案1:用readLine()+拆分处理(适合整行输入多个数字)

如果你习惯用BufferedReader,可以先读取整行输入,再按空格拆分出数字:

BufferedReader inp = new BufferedReader(new InputStreamReader(System.in));
// 读取整行输入,按任意数量的空格拆分
String[] numStrs = inp.readLine().split("\\s+");
// 提取前5个数字(确保输入足够的话)
for (int i = 0; i < 5 && i < numStrs.length; i++) {
    int num = Integer.parseInt(numStrs[i]);
    System.out.println("读取到数字:" + num);
}
inp.close();

这种方式不管你输入时用多少空格分隔数字,都能正确提取出单个数字。

方案2:用read()过滤非数字字符(坚持用read()的场景)

如果一定要用read()方法,可以在读取时跳过空格、换行这些非数字字符,直到收集到5个数字:

BufferedReader inp = new BufferedReader(new InputStreamReader(System.in));
int collectedCount = 0;
int charCode;

while (collectedCount < 5 && (charCode = inp.read()) != -1) {
    char c = (char) charCode;
    // 判断当前字符是否是数字
    if (Character.isDigit(c)) {
        int num = c - '0'; // 把字符转成对应的数字
        System.out.println("读取到数字:" + num);
        collectedCount++;
    }
    // 非数字字符直接跳过,不计数
}
inp.close();

这样不管你输入时怎么分隔数字(空格、换行都可以),只要凑够5个数字,程序才会结束。

方案3:用Scanner更省心(推荐处理数值输入)

如果只是为了读取数字,Java的Scanner类专门做了优化,它默认会把空格、换行等空白字符当作分隔符,直接读取数值:

Scanner scanner = new Scanner(System.in);
for (int i = 0; i < 5; i++) {
    System.out.print("请输入第" + (i+1) + "个数字:");
    int num = scanner.nextInt();
    System.out.println("你输入的是:" + num);
}
scanner.close();

这种方式下,你可以一行输入1 2 3 4 5,也可以分5行输入每个数字,程序都会等你输入够5个数字才结束。

内容的提问来源于stack exchange,提问作者ratRiot01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 08:07:35