java能够执行本地命令行,可是有一个坑,命令执行后,已经执行完毕,可是卡死不返回,这是由于:java
命令会返回两个输出流,正确的返回流,和错误的返回流缓存
通常程序的作法是先循环读正确的返回流,再读错误的返回流,当正确的返回流读不完的时候,有可能错误的返回流已经占满了缓存,因此致使了卡死,app
解决办法是:ui
1.单独起一个线程读取错误流,这样的状况下,错误流比较很差保存spa
2.使用ProcessBuild类,这个类能够把错误流重定向到正确流,这样只读一个流就能够了,不论正确或错误,都能读到返回,下面是个例子命令行
ProcessBuilder pb;
Process process = null;
BufferedReader br = null;
StringBuilder resMsg = null;
OutputStream os = null;
String cmd1 = "sh";
try {
pb = new ProcessBuilder(cmd1);
pb.redirectErrorStream(true);
process = pb.start();
os = process.getOutputStream();
os.write(command.getBytes());
os.flush();
os.close();
resMsg = new StringBuilder();
// get command result
if (isNeedResultMsg) {
br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String s;
while ((s = br.readLine()) != null) {
resMsg.append(s + "\n");
}
resMsg.deleteCharAt(resMsg.length()-1);
result = process.waitFor();
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (os != null) {
os.close();
}
if (br != null) {
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
if (process != null) {
process.destroy();
}
}
return resMsg.toString();