繁体   English   中英

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

[英]“BufferedReader.ready” vs. “while(BufferedReader.readLine()!=null)”

我是 java 的新手。 我想从 java 开始的进程中读取标准输出。 我通过谷歌搜索得到以下代码:

    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)应该产生的 output(顺便说一句,我在 Linux,openJDK 1.6)

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

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

它按预期工作。

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

在前面的循环中,您只是在准备好的 state 上循环,而不是从 stream 读取任何字节。

当您到达ready()测试时,该命令尚未产生任何 output 并且它返回false ,立即结束循环。

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

这是一个非常简单的场景,因此它在大多数情况下都有效,但它不是一个通常可以应用的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM