使用BufferedReader读取标准输入时,如何避免等待回车键触发输出?
问题说明
我写了一个简单的Java程序来演示遇到的问题:
package bufferedreader_test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class BufferedReaderTest { public static void main(String[] args) { try { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String line[] = new String[2]; for (int i=0; i<2; i++) line[i] = br.readLine(); for (int j=0; j<line.length; j++) System.out.println(line[j]); } catch (IOException e) { e.printStackTrace(); } } }
当我把两行内容复制粘贴到控制台时,程序不会立刻打印结果,反而要等我按下Enter键才会输出。有没有办法让程序读取到第二行后就直接打印结果,不用额外按Enter?
解决方案
原因分析
BufferedReader.readLine() 是按换行符触发读取的,控制台的输入流默认是行缓冲模式——只有当检测到换行符或者输入流被关闭时,才会把缓冲区的内容提交给程序。复制粘贴两行内容时,虽然内容里包含换行符,但部分终端会把整个粘贴的内容先暂存到自身缓冲区,直到手动按Enter才把所有内容推给Java程序的标准输入流。
代码实现
要绕过这个限制,不能依赖readLine()的行缓冲逻辑,改成逐字符读取并自行判断行结束,同时实时监听输入流的可用数据:
package bufferedreader_test; import java.io.IOException; import java.io.InputStream; public class ImmediateInputTest { public static void main(String[] args) { InputStream input = System.in; StringBuilder[] lines = new StringBuilder[2]; for (int i = 0; i < lines.length; i++) { lines[i] = new StringBuilder(); } int currentLine = 0; int charRead; try { while (currentLine < 2) { // 实时检查输入流是否有可读取的字符 while (input.available() > 0) { charRead = input.read(); if (charRead == '\n') { // 读取到一行结束,切换到下一行 currentLine++; if (currentLine >= 2) { break; } } else if (charRead != '\r') { // 忽略Windows系统的回车符 lines[currentLine].append((char) charRead); } } // 读取到两行后立即退出循环 if (currentLine >= 2) { break; } // 短暂休眠避免CPU空转 Thread.sleep(50); } // 立即打印读取到的两行内容 for (StringBuilder line : lines) { System.out.println(line); } } catch (IOException | InterruptedException e) { e.printStackTrace(); } } }
关键说明
- 用
InputStream.available()实时检测输入流中的可用字符,不需要等待终端触发换行提交 - 自行处理换行符来分割行,读取到第二行后直接终止读取逻辑并打印结果
- 加入
Thread.sleep(50)短暂休眠,避免程序持续空转占用CPU
另外,如果使用的是IDE内置终端,部分终端的粘贴行为会自带暂存逻辑,这种情况下可以尝试调整终端设置(比如关闭“粘贴时自动添加换行”),但上面的代码可以在大多数终端环境下解决问题。
内容的提问来源于stack exchange,提问作者WebViewer
相关产品推荐
相关产品推荐

