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

Java使用BufferedReader读取重定向System.in时卡在最后一行不终止

根因分析

  • 核心问题是你的file.txt最后一行末尾没有换行符(\n)或回车符(\r):BufferedReader.readLine()的触发逻辑是只有读取到换行符、回车符,或者输入流结束标记(EOF)时,才会把读到的内容作为一行返回。如果最后一行没有行结束符,方法会一直阻塞等待后续输入,直到你手动终止程序时,输入流被强制关闭才会返回剩余内容,所以最后一行只有终止时才会输出。
  • 次要问题是你关闭流的顺序错误:应该先关闭外层包装流BufferedReader,再关闭内层节点流InputStreamReader,否则可能导致缓冲数据未正常刷出。

解决方案

  1. 优先修改输入文件:打开file.txt在最后一行末尾敲一个回车换行,保存后重新运行程序即可正常输出所有内容,这是成本最低的解决方式。
  2. 若无法修改输入文件,可改用read()方法逐字符读取,不需要等待行结束符就能处理内容:
public void updateText() throws IOException {
    // 用try-with-resources自动关流,不需要手动写close逻辑,更安全
    try (InputStreamReader inputStreamReader = new InputStreamReader(System.in);
         BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {
        int c;
        while ((c = bufferedReader.read()) != -1) {
            System.out.print((char) c);
        }
        // 手动刷出缓冲确保所有内容输出
        System.out.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
  1. 如果你必须保留readLine()的行处理逻辑,可以手动判断流的可用字节数,避免阻塞:
public void updateText() throws IOException {
    try (InputStreamReader inputStreamReader = new InputStreamReader(System.in);
         BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {
        String inputLine;
        // 先判断是否有可用内容,避免无内容时阻塞,适配文件重定向场景
        while (bufferedReader.ready()) { 
            inputLine = bufferedReader.readLine();
            if (inputLine == null) break;
            System.out.println(inputLine);
        }
        System.out.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:54:04