1. 程式人生 > >java執行命令列,以及解決卡死問題

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();