用Runtime exec 执行一个命令时,我希望能读出命令的输出和error,于是我先读Input, 再读error
Process p = Runtime.getRuntime().exec(command);
BufferedReader reader = new BufferedReader(new InputStreamReader(
p.getInputStream()));
BufferedReader error = new BufferedReader(new InputStreamReader(
p.getErrorStream()));
String line = reader.readLine();
while (line != null) {
output = output + line + "\n";
line = reader.readLine();
}
reader.close();
while ((line = error.readLine()) != null) {
System.out.println("ERROR: " + line);
}
error.close();
可是,用以上的代码执行程序,有时候程序会hang,一直卡在reader.readLine()这一行。
查了一下,原因是程序运行时在写stdout之前先写了stderr,所以以上的代码“假死”的原因是在没有读取stderr的情况下先读stdoutput,以致被block
解决方法可以是用thread并行读取stdout/err,或者可以看一下Apache Commons Exec这个库