1. 程式人生 > >java.lang.ProcessBuilder類 小結

java.lang.ProcessBuilder類 小結

一、概述
      ProcessBuilder類是J2SE 1.5在java.lang中新新增的一個新類,此類用於建立作業系統程序,它提供一種啟動和管理程序(也就是應用程式)的方法。在J2SE 1.5之前,都是由Process類處來實現程序的控制管理。
      每個 ProcessBuilder 例項管理一個程序屬性集。它的start() 方法利用這些屬性建立一個新的 Process 例項。start() 方法可以從同一例項重複呼叫,以利用相同的或相關的屬性建立新的子程序。 (我在《深入研究java.lang.Runtime類》中講過,程序也可以由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");
 Map<String, String> env = pb.environment();
 env.put("VAR1", "myValue");
 env.remove("OTHERVAR");
 env.put("VAR2", env.get("VAR1") + "suffix");
 pb.directory("myDir");
 Process p = pb.start();
 要利用一組明確的環境變數啟動程序,在新增環境變數之前,首先呼叫 Map.clear()。
  二、API預覽

    構造方法摘要
    ProcessBuilder(List<String> command)
      利用指定的作業系統程式和引數構造一個程序生成器。
    ProcessBuilder(String... command)
      利用指定的作業系統程式和引數構造一個程序生成器。       方法摘要
    command()
      返回此程序生成器的作業系統程式和引數。
    command(List<String> command)
      設定此程序生成器的作業系統程式和引數。
    command(String... command)
      設定此程序生成器的作業系統程式和引數。
    directory()
      返回此程序生成器的工作目錄。
    directory(File directory)
      設定此程序生成器的工作目錄。
    environment()
      返回此程序生成器環境的字串對映檢視。
    redirectErrorStream()
      通知程序生成器是否合併標準錯誤和標準輸出。
    redirectErrorStream(boolean redirectErrorStream)
      設定此程序生成器的 redirectErrorStream 屬性。
    start()
      使用此程序生成器的屬性啟動一個新程序。   三、常見應用
      若要使用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.");
                }
        }
}

這個類的原始碼;

相關推薦

java.lang.ProcessBuilder 小結

一、概述      ProcessBuilder類是J2SE 1.5在java.lang中新新增的一個新類,此類用於建立作業系統程序,它提供一種啟動和管理程序(也就是應用程式)的方法。在J2SE 1.

深入研究java.lang.ProcessBuilder

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

深入研究java.lang.Object

下一個 line 版本號 gin bool 獲得 不同 ava 表達 前言:Java的類庫日益龐大。所包括的類和接口也不計其數。但當中有一些非常重要的類和接口,是Java類庫中的核心部分。常見的有String、Object、Class、Collection、Class

ava中java.lang.Void小記

一個 返回 源代碼 lang his stat pen 閱讀 threads 軟件151,牟俊 在閱讀JDK源代碼的時候發現了有Void這麽個類,Void類是一個不可實例化的占位符類,它持有對標識Java關鍵字void的Class對象的引用。 Void的類定義如下: pac

java.lang.NullPointerException at java.lang.ProcessBuilder.start(Unknown Source) at org.apache.hadoop.util.Shell.runCommand(Shell.java:482)

想要 fileutil acc 測試 cep .net parent int pre 1:問題出現的原因,部署好的hadoop-2.6.4進行window10操作hadoop api出現的錯誤,具體錯誤是我向hdfs上傳文件,還好點,之前解決過,這裏不敘述,這裏說一下從hd

java.lang.Class中的某些方法

getc 不定 sys etc .get out 類名 ont class類 反射的代碼會經常遇到,Class類中方法真的多,且用的少,大多用在底層源碼這塊,既然看到了,就記錄一下吧,說不定以後厲害了,自己封裝框架,haha getComponentType()方法: S

java.lang.Boolean 源碼解析

als lan tin binary 1.4 logical ide truct all Boolean源碼比較簡單。 1 public final class Boolean implements java.io.Serializable, 2

Java 線程--繼承java.lang.Thread實現線程

機制 定義 block start pan nds ++ pla 兩種 現實生活中的很多事情是同時進行的,Java中為了模擬這種狀態,引入了線程機制。先來看線程的基本概念。 線程是指進程中的一個執行場景,也就是執行流程,進程和線程的區別: 1.每個進程是一個應用程序,都有獨

深度解析java.lang.String的equal(Object obj)方法

rst string類型 object ring ava [] div compareto ins 背景:最近在研究靜態掃描的東西,遇到一個規則:"equals(Object obj)" should be overridden along with the "compar

java.lang math

大於 都是 oid 示例代碼 功能 rand rgs 要求 是否 我們在編程的過程中,經常對一些數字進行數學操作,比如我們想要求絕對值或余弦什麽的。那這些方法是否需要我們自己實現嗎?其實在 java.lang 裏的 Math 類Math 類包含用於執行基本數學運算的方法,如

深入理解java:執行緒本地變數 java.lang.ThreadLocal

ThreadLocal,很多人都叫它做執行緒本地變數,也有些地方叫做執行緒本地儲存,其實意思差不多。 可能很多朋友都知道ThreadLocal為變數在每個執行緒中都建立了一個副本,那樣每個執行緒可以訪問自己內部的副本變數。 這句話從表面上看起來理解正確,但實際上這種理解是不太正確的。下面我們

深入研究java.lang.ThreadLocal

ThreadLocal是什麼呢?其實ThreadLocal並非是一個執行緒的本地實現版本,它並不是一個Thread,而是threadlocalvariable(執行緒區域性變數)。也許把它命名為ThreadLocalVar更加合適。執行緒區域性變數(Threa

xamarin android如何將Java.Lang.Object型轉成C#

.get 題目 後來 main mon protected 必須 source ide 問題起源 其實這個標題也可以換一個更準確一點,因為我遇到的問題是: xamarin android中的Class繼承了Java.Lang.Object ,將json序列化成c#類型時發現

專案啟動時,一直報java.lang.ClassNotFoundException(找不到異常)

web.xml配置檔案中一直報java.lang.ClassNotFoundException(類找不到異常),有一方面原因則是在開發時,我們引用maven的pom依賴的jar包,並沒有進行與專案繫結

java.lang.reflect Method

java.lang.reflect 類 Method public final class Methodextends AccessibleObjectimplements GenericDeclaration, Member Method 提供關於類或介面上單獨

java.lang.Math中的方法

java.lang.Math類中包含E和PI兩個靜態常量,以及進行科學計算的類(static)方法,可以直接通過類名呼叫。public static final Double E = 2.7182818284590452354 public static final Double PI = 3.14159

追根溯源---java.lang.String為什麼是final的?

java.lang.String類為什麼設計成 final 的? 首先,先得清楚 final 這個關鍵字。 final的出現就是為了為了不想改變,而不想改變的理由有兩點:設計或者效率。final 修飾的類是不被能繼承的,所以 final 修飾的類是不能被篡改

Java.lang.Thread的sleep方法導致Java執行緒InterruptedException異常

當一個方法後面宣告可能會丟擲InterruptedException異常時,說明該方法是可能會花一點時間,但是可以取消的方法。 拋InterruptedException的代表方法有: 1.Java.

java web 工程找不到tomcat java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

ood cep 找不到 otf 技術分享 .get http except 分享 ava.lang.ClassNotFoundException: com.mysql.jdbc.Driverat org.apache.catalina.loader.WebappClassL

2型轉換異常:Exception in thread "main" java.lang.ClassCastException:java.lang.Object cannot be cast to java.lang.Integer

cnblogs color pan rgs main string [] 類型 style public class TestException { public static void main(String[] args) { Object obj