对于某些终端命令,它们会重复输出。例如,对于生成文件的东西,它可能会输出完成的百分比。使用Java获取终端命令的输出
我知道如何使用
Process p = Runtime.getRuntim().exec("command goes here");
调用终端命令在Java中,但并没有给我的命令的电流输出的活饲料。我怎样才能做到这一点,例如,我可以每100毫秒执行一次System.out.println()
,以查看过程的最新输出结果。
对于某些终端命令,它们会重复输出。例如,对于生成文件的东西,它可能会输出完成的百分比。使用Java获取终端命令的输出
我知道如何使用
Process p = Runtime.getRuntim().exec("command goes here");
调用终端命令在Java中,但并没有给我的命令的电流输出的活饲料。我怎样才能做到这一点,例如,我可以每100毫秒执行一次System.out.println()
,以查看过程的最新输出结果。
您需要从进程读取InputStream
,这里有一个例子:
编辑我修改了代码为suggested here与stdInput
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
我试过了,但它似乎冻结在in.readLine()(它不输出任何东西,但不会结束while循环) – CodeGuy 2013-02-16 21:33:39
也许你正在运行的命令不输出任何\ r或\ n字符(这会告诉BufferedReader它已经读完整一行)?也许它不会在某些终端模式下产生任何输出(尝试将结果输送到“更多”并查看它输出的内容)?也许该命令将其输出写入stderr而不是stdout? – dnault 2013-02-16 21:36:11
它会冻结等待输入,所以你的进程不会用'newline'终止数据,或者根本不写入'stdout' – iTech 2013-02-16 21:38:38
当然,它允许访问STDOUT和STDERR。见http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html – home 2013-02-16 21:30:03
谢谢你。那么,你能举一个例子来说明如何使用它来每100毫秒获得输出吗? – CodeGuy 2013-02-16 21:30:48
请参阅http://stackoverflow.com/questions/3643939/java-process-with-input-output-stream – home 2013-02-16 21:32:03