2010年9月28日 星期二

[ Java 文章收集 ] 深入研究 java.lang.ProcessBuilder 類


轉載自 這裡
前言 :
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();

下面是一個利用修改過的工作目錄和環境啟動進程的例子 :
  1. ProcessBuilder pb = new ProcessBuilder("myCommand""myArg1""myArg2"); // myCommand 必須存在目前工作目錄, 或是有設環境變數 Path.  
  2. Map env = pb.environment();  
  3. env.put("VAR1""myValue");  
  4. env.remove("OTHERVAR");  
  5. env.put("VAR2", env.get("VAR1") + "suffix");  
  6. pb.directory("myDir");  // 改變工作目錄  
  7. Process p = pb.start();  
要利用一組明確的環境變量啟動進程,在添加環境變量之前,首先調用Map.clear().

API 預覽 :
- 構造方法摘要
ProcessBuilder(List command)
利用指定的操作系統程序和參數構造一個進程生成器。
ProcessBuilder(String... command)
利用指定的操作系統程序和參數構造一個進程生成器。

- 方法摘要
command()
返回此進程生成器的操作系統程序和參數。
command(List command)
設置此進程生成器的操作系統程序和參數。
command(String... command)
設置此進程生成器的操作系統程序和參數。
directory()
返回此進程生成器的工作目錄。
directory(File directory)
設置此進程生成器的工作目錄。
environment()
返回此進程生成器環境的字符串映射視圖。
redirectErrorStream()
通知進程生成器是否合併標準錯誤和標準輸出。
redirectErrorStream(boolean redirectErrorStream)
設置此進程生成器的redirectErrorStream 屬性。
start()
使用此進程生成器的屬性啟動一個新進程

更多請參考 線上 jdk 1.5 說明

常見應用 :
若要使用ProcessBuilder創建一個進程,只需要創建ProcessBuilder的一個實例,指定該進程的名稱和所需參數。 要執行此程序,調用該實例上的start()即可。 下面上一個執行Windows記事本的例子。 注意它將要編輯的文件名指定為一個參數 :
  1. class PBDemo {   
  2.         public static void main(String args[]) {   
  3.                 try {   
  4.                         ProcessBuilder proc = new ProcessBuilder("notepad.exe""testfile");   
  5.                         proc.start();   
  6.                 } catch (Exception e) {   
  7.                         System.out.println("Error executing notepad.");   
  8.                 }   
  9.         }   
  10. }  
This message was edited 6 times. Last update was at 07/09/2010 12:12:31

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...