轉載自 這裡
前言 :
ProcessBuilder類是J2SE 1.5在java.lang中新添加的一個新類,此類用於創建操作系統進程,它提供一種啟動和管理進程(也就是應用程序)的方法。 在J2SE 1.5之前,都是由Process類處來實現進程的控制管理.
每個ProcessBuilder 實例管理一個進程屬性集。 它的start() 方法利用這些屬性創建一個新的Process 實例。 start() 方法可以從同一實例重複調用,以利用相同的或相關的屬性創建新的子進程。 (進程也可以由Runtime.exec()啟動。)
每個進程生成器(即ProcessBuilder對象)管理這些進程屬性 :
命令 是一個字符串列表,它表示要調用的外部程序文件及其參數 (如果有). 在此,表示有效的操作系統命令的字符串列表是依賴於系統的。 例如,每一個總體變量,通常都要成為此列表中的元素,但有一些操作系統,希望程序能自己標記命令行字符串——在這種系統中,Java實現可能需要命令確切地包含這兩個元素。
環境變量依賴於系統的映射. 初始值是當前進程環境的一個副本 (請參閱System.getenv()). 工作目錄默認值是當前進程的當前工作目錄,通常根據系統屬性user.dir來命名。
redirectErrorStream屬性最初為false,意思是子進程的標準輸出和錯誤輸出被發送給兩個獨立的流,這些流可以通過Process.getInputStream()和Process.getErrorStream()方法來訪問. 如果將值設置為true,標準錯誤將與標準輸出合併。 這使得關聯錯誤消息和相應的輸出變得更容易。 在此情況下,合併的數據可從Process.getInputStream()返回的流讀取,而從Process.getErrorStream()返回的流讀取將直接到達文件尾.
既然有Process類,那為什麼還要發明個ProcessBuilder類呢? ProcessBuilder和Process兩個類有什麼區別呢?原來,ProcessBuilder為進程提供了更多的控制,例如,可以設置當前工作目錄,還可以改變環境參數。 而Process的功能相對來說簡單的多。
ProcessBuilder是一個final類,有兩個帶參數的構造方法,你可以通過構造方法來直接創建ProcessBuilder的對象。 而Process是一個抽像類,一般都通過Runtime.exec()和ProcessBuilder.start()來間接創建其實例.
注意 : 修改進程構建器的屬性將影響後續由該對象的start() 方法啟動的進程,但從不會影響以前啟動的進程或Java 自身的進. ProcessBuilder類不是同步的。 如果多個線程同時訪問一個ProcessBuilder,而其中至少一個線程從結構上修改了其中一個屬性,它必須保持外部同步.
簡單使用介紹 :
很容易啟動一個使用默認工作目錄和環境的新進程 :
Process p = new ProcessBuilder("myCommand", "myArg").start();
下面是一個利用修改過的工作目錄和環境啟動進程的例子 :
要利用一組明確的環境變量啟動進程,在添加環境變量之前,首先調用Map.clear().
API 預覽 :
- 構造方法摘要
- 方法摘要
更多請參考 線上 jdk 1.5 說明
常見應用 :
若要使用ProcessBuilder創建一個進程,只需要創建ProcessBuilder的一個實例,指定該進程的名稱和所需參數。 要執行此程序,調用該實例上的start()即可。 下面上一個執行Windows記事本的例子。 注意它將要編輯的文件名指定為一個參數 :
前言 :
ProcessBuilder類是J2SE 1.5在java.lang中新添加的一個新類,此類用於創建操作系統進程,它提供一種啟動和管理進程(也就是應用程序)的方法。 在J2SE 1.5之前,都是由Process類處來實現進程的控制管理.
每個ProcessBuilder 實例管理一個進程屬性集。 它的start() 方法利用這些屬性創建一個新的Process 實例。 start() 方法可以從同一實例重複調用,以利用相同的或相關的屬性創建新的子進程。 (進程也可以由Runtime.exec()啟動。)
每個進程生成器(即ProcessBuilder對象)管理這些進程屬性 :
命令 是一個字符串列表,它表示要調用的外部程序文件及其參數 (如果有). 在此,表示有效的操作系統命令的字符串列表是依賴於系統的。 例如,每一個總體變量,通常都要成為此列表中的元素,但有一些操作系統,希望程序能自己標記命令行字符串——在這種系統中,Java實現可能需要命令確切地包含這兩個元素。
環境變量依賴於系統的映射. 初始值是當前進程環境的一個副本 (請參閱System.getenv()). 工作目錄默認值是當前進程的當前工作目錄,通常根據系統屬性user.dir來命名。
redirectErrorStream屬性最初為false,意思是子進程的標準輸出和錯誤輸出被發送給兩個獨立的流,這些流可以通過Process.getInputStream()和Process.getErrorStream()方法來訪問. 如果將值設置為true,標準錯誤將與標準輸出合併。 這使得關聯錯誤消息和相應的輸出變得更容易。 在此情況下,合併的數據可從Process.getInputStream()返回的流讀取,而從Process.getErrorStream()返回的流讀取將直接到達文件尾.
既然有Process類,那為什麼還要發明個ProcessBuilder類呢? ProcessBuilder和Process兩個類有什麼區別呢?原來,ProcessBuilder為進程提供了更多的控制,例如,可以設置當前工作目錄,還可以改變環境參數。 而Process的功能相對來說簡單的多。
ProcessBuilder是一個final類,有兩個帶參數的構造方法,你可以通過構造方法來直接創建ProcessBuilder的對象。 而Process是一個抽像類,一般都通過Runtime.exec()和ProcessBuilder.start()來間接創建其實例.
注意 : 修改進程構建器的屬性將影響後續由該對象的start() 方法啟動的進程,但從不會影響以前啟動的進程或Java 自身的進. ProcessBuilder類不是同步的。 如果多個線程同時訪問一個ProcessBuilder,而其中至少一個線程從結構上修改了其中一個屬性,它必須保持外部同步.
簡單使用介紹 :
很容易啟動一個使用默認工作目錄和環境的新進程 :
Process p = new ProcessBuilder("myCommand", "myArg").start();
下面是一個利用修改過的工作目錄和環境啟動進程的例子 :
- ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2"); // myCommand 必須存在目前工作目錄, 或是有設環境變數 Path.
- Map
env = pb.environment(); - env.put("VAR1", "myValue");
- env.remove("OTHERVAR");
- env.put("VAR2", env.get("VAR1") + "suffix");
- pb.directory("myDir"); // 改變工作目錄
- Process p = pb.start();
API 預覽 :
- 構造方法摘要
- 方法摘要
更多請參考 線上 jdk 1.5 說明
常見應用 :
若要使用ProcessBuilder創建一個進程,只需要創建ProcessBuilder的一個實例,指定該進程的名稱和所需參數。 要執行此程序,調用該實例上的start()即可。 下面上一個執行Windows記事本的例子。 注意它將要編輯的文件名指定為一個參數 :
- class PBDemo {
- public static void main(String args[]) {
- try {
- ProcessBuilder proc = new ProcessBuilder("notepad.exe", "testfile");
- proc.start();
- } catch (Exception e) {
- System.out.println("Error executing notepad.");
- }
- }
- }
This message was edited 6 times. Last update was at 07/09/2010 12:12:31
沒有留言:
張貼留言