为何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
相关产品推荐
相关产品推荐

