ProcessBuilder.start() 和 Runtime.exec() 方法都被用來建立一個操做系統進程(執行命令行操做),並返回 Process 子類的一個實例,該實例可用來控制進程狀態並得到相關信息。 java
關鍵類:Process,ProcessBuilder,Runtime shell
1. Process 類提供了執行從進程輸入、執行輸出到進程、等待進程完成、檢查進程的退出狀態以及銷燬(殺掉)進程的方法。建立進程的方法可能沒法針對某些本機平臺上的特定進程很好地工做,好比,本機窗口進程,守護進程,Microsoft Windows 上的 Win16/DOS 進程,或者 shell 腳本。建立的子進程沒有本身的終端或控制檯。它的全部標準 io(即 stdin、stdout 和 stderr)操做都將經過三個流 (getOutputStream()、getInputStream() 和 getErrorStream()) 重定向到父進程。父進程使用這些流來提供到子進程的輸入和得到從子進程的輸出。由於有些本機平臺僅針對標準輸入和輸出流提供有限的緩衝區大小,若是讀寫子 進程的輸出流或輸入流迅速出現失敗,則可能致使子進程阻塞,甚至產生死鎖。 當沒有 Process 對象的更多引用時,不是刪掉子進程,而是繼續異步執行子進程。 對於帶有 Process 對象的 Java 進程,沒有必要異步或併發執行由 Process 對象表示的進程。 數組
2.每一個ProcessBuilder實例管理一個進程屬性集。ProcessBuilder的start()方法利用這些屬性建立一個新的Process實例。start()方法能夠從同一實例重複調用,以利用相同或者相關的屬性建立新的子進程。 併發
3.ProcessBuilder.start() 和 Runtime.exec()傳遞的參數有所不一樣,Runtime.exec()可接受一個單獨的字符串,這個字符串是經過空格來分隔可執行命令程序和參數的;也能夠接受字符串數組參數。而ProcessBuilder的構造函數是一個字符串列表或者數組。列表中第一個參數是可執行命令程序,其餘的是命令行執行是須要的參數。經過查看JDK源碼可知,Runtime.exec最終是經過調用ProcessBuilder來真正執行操做的。
關鍵方法: 異步
p = Runtime.getRuntime().exec(cmd); // 取得命令結果的輸出流 InputStream fis = p.getInputStream(); // 用一個讀輸出流類去讀 InputStreamReader isr = new InputStreamReader(fis); // 用緩衝器讀行 BufferedReader br = new BufferedReader(isr); String line = null; // 直到讀完爲止 while ((line = br.readLine()) != null) { System.out.println(line); } ProcessBuilder pb = new ProcessBuilder("java", "-jar", "Test3.jar"); // 讓這個進程的工做區空間改成F:\dist // 這樣的話,它就會去F:\dist目錄下找Test.jar這個文件 pb.directory(new File("F:\\dist")); // 獲得進程生成器的環境 變量,這個變量咱們能夠改, // 改了之後也會反應到新起的進程裏面去 Map<String, String> map = pb.environment(); Process p1 = pb.start(); // 而後就能夠對p作本身想作的事情了 // 本身這個時候就能夠退出了 System.exit(0);