1. 程式人生 > >JDK5的ProcessBuilder介紹和使用例項

JDK5的ProcessBuilder介紹和使用例項

                原文地址:http://www.java2000.net/p9751
JDK地址:http://www.java2000.net/doc/jdk6_cn/java/lang/ProcessBuilder.html

一、JDK中的介紹摘錄
此類用於建立作業系統程序。

每個 ProcessBuilder 例項管理一個程序屬性集。start() 方法利用這些屬性建立一個新的 Process 例項。start() 方法可以從同一例項重複呼叫,以利用相同的或相關的屬性建立新的子程序。

每個程序生成器管理這些程序屬性:

* 命令
是一個字串列表,它表示要呼叫的外部程式檔案及其引數(如果有)。在此,表示有效的作業系統命令的字串列表是依賴於系統的。例如,每一個總體變數,通常都要成為此列表中的元素,但有一些作業系統,希望程式能自己標記命令列字串——在這種系統中,Java 實現可能需要命令確切地包含這兩個元素。

* 環境

     是從變數 到值 的依賴於系統的對映。初始值是當前程序環境的一個副本(請參閱 System.getenv())。

* 工作目錄
     預設值是當前程序的當前工作目錄,通常根據系統屬性 user.dir 來命名。

* redirectErrorStream 屬性
最初,此屬性為false,意思是子程序的標準輸出和錯誤輸出被髮送給兩個獨立的流,這些流可以通過Process.getInputStream() 和Process.getErrorStream() 方法來訪問。如果將值設定為true,標準錯誤將與標準輸出合併。這使得關聯錯誤訊息和相應的輸出變得更容易。在此情況下,合併的資料可從Process.getInputStream() 返回的流讀取,而從 Process.getErrorStream()返回的流讀取將直接到達檔案尾。

修改程序構建器的屬性將影響後續由該物件的 start() 方法啟動的程序,但從不會影響以前啟動的程序或 Java 自身的程序。

大多數錯誤檢查由 start() 方法執行。可以修改物件的狀態,但這樣 start() 將會失敗。例如,將命令屬性設定為一個空列表將不會丟擲異常,除非包含了 start()。

注意,此類不是同步的
。如果多個執行緒同時訪問一個 ProcessBuilder,而其中至少一個執行緒從結構上修改了其中一個屬性,它必須 保持外部同步。

很容易啟動一個使用預設工作目錄和環境的新程序:
  1. Process p = new ProcessBuilder("myCommand""myArg").start();
下面是一個利用修改過的工作目錄和環境啟動程序的例子:
  1.      ProcessBuilder pb = new ProcessBuilder("myCommand""myArg1""myArg2");
  2.      Map<String, String> env = pb.environment();
  3.      env.put("VAR1""myValue");
  4.      env.remove("OTHERVAR");
  5.      env.put("VAR2", env.get("VAR1") + "suffix");
  6.      pb.directory(new File("myDir"));
  7.      Process p = pb.start();


二、使用案例
使用Runtime的例子
  1. package net.java2000.util;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.util.Arrays;
  7. /**
  8.  * 
  9.  * @author 趙學慶,Java世紀網(java2000.net)
  10.  *
  11.  */
  12. publicclass TestRuntime {
  13. /**
  14.    * @param args
  15.    * @throws Exception
  16.    */
  17.   publicstaticvoid main(String[] args) throws Exception {
  18.     Runtime runtime = Runtime.getRuntime();
  19.     Process process = runtime.exec("cmd /c dir",null,new File("e:/"));
  20.     InputStream is = process.getInputStream();
  21.     InputStreamReader isr = new InputStreamReader(is,"GBK");
  22.     BufferedReader br = new BufferedReader(isr);
  23.     String line;
  24.     System.out.printf("Output of running %s is:", Arrays.toString(args));
  25. while ((line = br.readLine()) != null) {
  26.       System.out.println(line);
  27.     }
  28.   }
  29. }

使用ProcessBuilder的例子
  1. package net.java2000.util;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.util.Arrays;
  7. /**
  8.  * 
  9.  * @author 趙學慶,Java世紀網(java2000.net)
  10.  *
  11.  */
  12. publicclass TestProcessBuilder {
  13. publicstaticvoid main(String args[]) throws Exception {
  14.     ProcessBuilder builder = new ProcessBuilder("cmd""/c""dir");
  15.     builder.directory(new File("e:/"));
  16.     Process process = builder.start();
  17.     InputStream is = process.getInputStream();
  18.     InputStreamReader isr = new InputStreamReader(is, "GBK");
  19.     BufferedReader br = new BufferedReader(isr);
  20.     String line;
  21.     System.out.printf("Output of running %s is:", Arrays.toString(args));
  22. while ((line = br.readLine()) != null) {
  23.       System.out.println(line);
  24.     }
  25.   }
  26. }

總結:
ProcessBuilder為程序提供了更多的控制,例如,可以設定當前工作目錄,還可以改變環境引數。而Process的功能相對來說簡單的多。

ProcessBuilder是一個final類,有兩個帶引數的構造方法,你可以通過構造方法來直接建立ProcessBuilder的物件。而 Process是一個抽象類,一般都通過Runtime.exec()和ProcessBuilder.start()來間接建立其例項。










<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>