“BufferedReader.ready”与“while(BufferedReader.readLine()!= null)”

时间:2011-08-16 16:17:17

标签: java bufferedreader

对于java来说,我是新手。我想从java中启动的进程中读取stdout。我在谷歌搜索时得到了以下代码:

    Runtime rt = Runtime.getRuntime();
    Process proc = rt.exec(args);
    BufferedReader br = new BufferedReader(
        new InputStreamReader(proc.getInputStream()));
    while(br.ready()){
            System.out.println(br.readLine());
    }

但是,此代码不会打印进程(例如,ls)应该生成的输出(顺便说一句,我在Linux上,openJDK 1.6)

但如果我将while循环更改为:

    String line;
    while((line = br.readLine())!=null){
            System.out.println(line);
    }

它按预期工作。

以前的代码有什么问题?根据java api doc所说的,我认为它们是相似的。

2 个答案:

答案 0 :(得分:5)

在上一个循环中,您只是循环使用就绪状态,而不是从流中读取任何字节。

答案 1 :(得分:0)

当你到达ready()测试时,命令还没有产生任何输出,它返回false,立即结束循环。

您的第二个代码有效,因为readLine()调用会阻塞,直到它读取整行。如果没有进一步的控制,这种代码的输出是不可预测的,因为它取决于命令产生的输出量和完成所需的时间。

这是一个非常简单的场景,因此它大部分时间都可以工作,但它不是通常可以应用的解决方案。