Java使用BufferedReader读取重定向System.in时卡在最后一行不终止
根因分析
- 核心问题是你的
file.txt最后一行末尾没有换行符(\n)或回车符(\r):BufferedReader.readLine()的触发逻辑是只有读取到换行符、回车符,或者输入流结束标记(EOF)时,才会把读到的内容作为一行返回。如果最后一行没有行结束符,方法会一直阻塞等待后续输入,直到你手动终止程序时,输入流被强制关闭才会返回剩余内容,所以最后一行只有终止时才会输出。 - 次要问题是你关闭流的顺序错误:应该先关闭外层包装流
BufferedReader,再关闭内层节点流InputStreamReader,否则可能导致缓冲数据未正常刷出。
解决方案
- 优先修改输入文件:打开
file.txt在最后一行末尾敲一个回车换行,保存后重新运行程序即可正常输出所有内容,这是成本最低的解决方式。 - 若无法修改输入文件,可改用
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(); } }
- 如果你必须保留
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
相关产品推荐
相关产品推荐

