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

为何BufferedReader循环读取STDIN时,需加println数组才会全填充?

问题分析与解决

核心问题:ready()方法的误用

你遇到的问题根源完全在while(r.ready())这个循环条件上。

BufferedReader.ready()的作用不是判断输入流是否还有后续数据,它仅仅是返回当前输入流的缓冲区中是否有可立即读取的字符。如果输入流的缓冲区暂时为空(比如STDIN的数据还没完全传输过来,或者系统还没把更多数据写入缓冲区),ready()就会返回false,导致循环提前退出,剩下的数据没被读取,数组自然会留一堆null。

那为什么加了System.out.println()就能读全?因为println()是同步输出操作,会产生短暂阻塞,给了STDIN足够的时间把后续数据写入缓冲区,让ready()每次都能返回true,直到所有数据读完。而flush()只是刷新输出缓冲区,不会产生阻塞等待,所以起不到同样的效果。

正确写法

别用ready()做循环条件,直接判断readLine()的返回值是否为null——当输入流结束时,readLine()才会返回null,这才是判断输入是否结束的正确方式:

BufferedReader r = new BufferedReader(new InputStreamReader(System.in));        
int lineCount = 0;
String[] titles = new String[50000];    
String s;
while((s = r.readLine()) != null) {
    titles[lineCount++] = s;
}

这样不管输入数据是分批还是一次性传输,都能保证读完所有行,不会提前退出循环。

内容的提问来源于stack exchange,提问作者b-frid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 20:40:57