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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:05:40