2013-02-16 70 views
3

对于某些终端命令,它们会重复输出。例如,对于生成文件的东西,它可能会输出完成的百分比。使用Java获取终端命令的输出

我知道如何使用

Process p = Runtime.getRuntim().exec("command goes here"); 

调用终端命令在Java中,但并没有给我的命令的电流输出的活饲料。我怎样才能做到这一点,例如,我可以每100毫秒执行一次System.out.println(),以查看过程的最新输出结果。

+0

当然,它允许访问STDOUT和STDERR。见http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html – home 2013-02-16 21:30:03

+0

谢谢你。那么,你能举一个例子来说明如何使用它来每100毫秒获得输出吗? – CodeGuy 2013-02-16 21:30:48

+1

请参阅http://stackoverflow.com/questions/3643939/java-process-with-input-output-stream – home 2013-02-16 21:32:03

回答

1

您需要从进程读取InputStream,这里有一个例子:

编辑我修改了代码为suggested herestdInput

ProcessBuilder builder = new ProcessBuilder("command goes here"); 
builder.redirectErrorStream(true); 
Process process = builder.start(); 
InputStream is = process.getInputStream(); 
BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 

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

收到errStream为了调试的目的,你可以将输入读取为字节而不是使用readLine,以防止进程不终止消息,并且newLine

+0

我试过了,但它似乎冻结在in.readLine()(它不输出任何东西,但不会结束while循环) – CodeGuy 2013-02-16 21:33:39

+0

也许你正在运行的命令不输出任何\ r或\ n字符(这会告诉BufferedReader它已经读完整一行)?也许它不会在某些终端模式下产生任何输出(尝试将结果输送到“更多”并查看它输出的内容)?也许该命令将其输出写入stderr而不是stdout? – dnault 2013-02-16 21:36:11

+0

它会冻结等待输入,所以你的进程不会用'newline'终止数据,或者根本不写入'stdout' – iTech 2013-02-16 21:38:38