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