JDK5的ProcessBuilder介紹和使用例項
阿新 • • 發佈:2018-12-21
原文地址: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,而其中至少一個執行緒從結構上修改了其中一個屬性,它必須 保持外部同步。
很容易啟動一個使用預設工作目錄和環境的新程序:
二、使用案例
使用Runtime的例子
使用ProcessBuilder的例子
總結:
ProcessBuilder為程序提供了更多的控制,例如,可以設定當前工作目錄,還可以改變環境引數。而Process的功能相對來說簡單的多。
ProcessBuilder是一個final類,有兩個帶引數的構造方法,你可以通過構造方法來直接建立ProcessBuilder的物件。而 Process是一個抽象類,一般都通過Runtime.exec()和ProcessBuilder.start()來間接建立其例項。
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
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()。
注意,此類不是同步的
很容易啟動一個使用預設工作目錄和環境的新程序:
- Process p = new ProcessBuilder("myCommand", "myArg").start();
- ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
- Map<String, String> env = pb.environment();
- env.put("VAR1", "myValue");
- env.remove("OTHERVAR");
- env.put("VAR2", env.get("VAR1") + "suffix");
- pb.directory(new File("myDir"));
- Process p = pb.start();
二、使用案例
使用Runtime的例子
- package net.java2000.util;
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.util.Arrays;
- /**
- *
- * @author 趙學慶,Java世紀網(java2000.net)
- *
- */
- publicclass TestRuntime {
- /**
- * @param args
- * @throws Exception
- */
- publicstaticvoid main(String[] args) throws Exception {
- Runtime runtime = Runtime.getRuntime();
- Process process = runtime.exec("cmd /c dir",null,new File("e:/"));
- InputStream is = process.getInputStream();
- InputStreamReader isr = new InputStreamReader(is,"GBK");
- BufferedReader br = new BufferedReader(isr);
- String line;
- System.out.printf("Output of running %s is:", Arrays.toString(args));
- while ((line = br.readLine()) != null) {
- System.out.println(line);
- }
- }
- }
使用ProcessBuilder的例子
- package net.java2000.util;
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.util.Arrays;
- /**
- *
- * @author 趙學慶,Java世紀網(java2000.net)
- *
- */
- publicclass TestProcessBuilder {
- publicstaticvoid main(String args[]) throws Exception {
- ProcessBuilder builder = new ProcessBuilder("cmd", "/c", "dir");
- builder.directory(new File("e:/"));
- Process process = builder.start();
- InputStream is = process.getInputStream();
- InputStreamReader isr = new InputStreamReader(is, "GBK");
- BufferedReader br = new BufferedReader(isr);
- String line;
- System.out.printf("Output of running %s is:", Arrays.toString(args));
- while ((line = br.readLine()) != null) {
- System.out.println(line);
- }
- }
- }
總結:
ProcessBuilder為程序提供了更多的控制,例如,可以設定當前工作目錄,還可以改變環境引數。而Process的功能相對來說簡單的多。
ProcessBuilder是一個final類,有兩個帶引數的構造方法,你可以通過構造方法來直接建立ProcessBuilder的物件。而 Process是一個抽象類,一般都通過Runtime.exec()和ProcessBuilder.start()來間接建立其例項。
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>