为何调用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
相关产品推荐
相关产品推荐

