java执行命令行,以及解决卡死问题
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();
via:https://my.oschina.net/u/222749/blog/2965712