对于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所说的,我认为它们是相似的。
答案 0 :(得分:5)
在上一个循环中,您只是循环使用就绪状态,而不是从流中读取任何字节。
答案 1 :(得分:0)
当你到达ready()
测试时,命令还没有产生任何输出,它返回false
,立即结束循环。
您的第二个代码有效,因为readLine()
调用会阻塞,直到它读取整行。如果没有进一步的控制,这种代码的输出是不可预测的,因为它取决于命令产生的输出量和完成所需的时间。
这是一个非常简单的场景,因此它大部分时间都可以工作,但它不是通常可以应用的解决方案。