java可以执行本地命令行,但是有一个坑,命令执行后,已经执行完毕,但是卡死不返回,这是因为:
命令会返回两个输出流,正确的返回流,和错误的返回流
一般程序的做法是先循环读正确的返回流,再读错误的返回流,当正确的返回流读不完的时候,有可能错误的返回流已经占满了缓存,所以导致了卡死,
解决办法是:
1.单独起一个线程读取错误流,这样的情况下,错误流比较不好保存
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();