W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
java.lang.Object
|---java.lang.ProcessBuilder
public final class ProcessBuilder
extends Object
此類用于創(chuàng)建操作系統(tǒng)進(jìn)程。
每個(gè) ProcessBuilder 實(shí)例管理一個(gè)流程屬性的集合。 start() 方法使用這些屬性創(chuàng)建一個(gè)新的 Process 實(shí)例。 可以從同一個(gè)實(shí)例重復(fù)調(diào)用 start() 方法來創(chuàng)建具有相同或相關(guān)屬性的新子流程。
每個(gè)流程構(gòu)建器都管理這些流程屬性:
如果該值設(shè)置為 true,則:
修改進(jìn)程構(gòu)建器的屬性將影響隨后由該對(duì)象的 start() 方法啟動(dòng)的進(jìn)程,但不會(huì)影響先前啟動(dòng)的進(jìn)程或 Java 進(jìn)程本身。
大多數(shù)錯(cuò)誤檢查由 start() 方法執(zhí)行。 可以修改對(duì)象的狀態(tài)以使 start() 失敗。 例如,將 command 屬性設(shè)置為空列表不會(huì)引發(fā)異常,除非調(diào)用 start()。
請(qǐng)注意,此類不同步。 如果多個(gè)線程同時(shí)訪問一個(gè) ProcessBuilder 實(shí)例,并且至少有一個(gè)線程在結(jié)構(gòu)上修改了其中一個(gè)屬性,則必須在外部進(jìn)行同步。
啟動(dòng)一個(gè)使用默認(rèn)工作目錄和環(huán)境的新進(jìn)程很容易:
Process p = new ProcessBuilder("myCommand", "myArg").start();
下面是一個(gè)示例,它使用修改后的工作目錄和環(huán)境啟動(dòng)進(jìn)程,并將標(biāo)準(zhǔn)輸出和錯(cuò)誤重定向到附加到日志文件中:
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"));
File log = new File("log");
pb.redirectErrorStream(true);
pb.redirectOutput(Redirect.appendTo(log));
Process p = pb.start();
assert pb.redirectInput() == Redirect.PIPE;
assert pb.redirectOutput().file() == log;
assert p.getInputStream().read() == -1;
要使用一組顯式環(huán)境變量啟動(dòng)進(jìn)程,請(qǐng)?jiān)谔砑迎h(huán)境變量之前首先調(diào)用 Map.clear()。
修飾符和類型 | 類 | 描述 |
---|---|---|
static class | ProcessBuilder.Redirect | 表示子流程輸入的來源或子流程輸出的目的地。 |
構(gòu)造函數(shù) | 描述 |
---|---|
ProcessBuilder(String... command) | 使用指定的操作系統(tǒng)程序和參數(shù)構(gòu)造一個(gè)進(jìn)程構(gòu)建器。 |
ProcessBuilder(ListString command) | 使用指定的操作系統(tǒng)程序和參數(shù)構(gòu)造一個(gè)進(jìn)程構(gòu)建器。 |
修飾符和類型 | 方法 | 描述 |
---|---|---|
ListString | command() | 返回此進(jìn)程構(gòu)建器的操作系統(tǒng)程序和參數(shù)。 |
ProcessBuilder | command(String... command) | 設(shè)置此進(jìn)程構(gòu)建器的操作系統(tǒng)程序和參數(shù)。 |
ProcessBuilder | command(ListString command) | 設(shè)置此進(jìn)程構(gòu)建器的操作系統(tǒng)程序和參數(shù)。 |
File | directory() | 返回此流程構(gòu)建器的工作目錄。 |
ProcessBuilder | directory(File directory) | 設(shè)置此流程構(gòu)建器的工作目錄。 |
MapString,String | environment() | 返回此流程構(gòu)建器環(huán)境的字符串映射視圖。 |
ProcessBuilder | inheritIO() | 將子進(jìn)程標(biāo)準(zhǔn) I/O 的源和目標(biāo)設(shè)置為與當(dāng)前 Java 進(jìn)程的相同。 |
ProcessBuilder.Redirect | redirectError() | 返回此流程構(gòu)建器的標(biāo)準(zhǔn)錯(cuò)誤目標(biāo)。 |
ProcessBuilder | redirectError(File file) | 將此流程構(gòu)建器的標(biāo)準(zhǔn)錯(cuò)誤目標(biāo)設(shè)置為文件。 |
ProcessBuilder | redirectError(ProcessBuilder.Redirect destination) | 設(shè)置此流程構(gòu)建器的標(biāo)準(zhǔn)錯(cuò)誤目標(biāo)。 |
boolean | redirectErrorStream() | 告知此流程構(gòu)建器是否合并標(biāo)準(zhǔn)錯(cuò)誤和標(biāo)準(zhǔn)輸出。 |
ProcessBuilder | redirectErrorStream(boolean redirectErrorStream) | 設(shè)置此流程構(gòu)建器的 redirectErrorStream 屬性。 |
ProcessBuilder.Redirect | redirectInput() | 返回此流程構(gòu)建器的標(biāo)準(zhǔn)輸入源。 |
ProcessBuilder | redirectInput(File file) | 將此流程構(gòu)建器的標(biāo)準(zhǔn)輸入源設(shè)置為文件。 |
ProcessBuilder | redirectInput(ProcessBuilder.Redirect source) | 設(shè)置此流程構(gòu)建器的標(biāo)準(zhǔn)輸入源。 |
ProcessBuilder.Redirect | redirectOutput() | 返回此流程構(gòu)建器的標(biāo)準(zhǔn)輸出目標(biāo)。 |
ProcessBuilder | redirectOutput(File file) | 將此流程構(gòu)建器的標(biāo)準(zhǔn)輸出目標(biāo)設(shè)置為文件。 |
ProcessBuilder | redirectOutput(ProcessBuilder.Redirect destination) | 設(shè)置此流程構(gòu)建器的標(biāo)準(zhǔn)輸出目標(biāo)。 |
Process | start() | 使用此流程構(gòu)建器的屬性啟動(dòng)一個(gè)新流程。 |
從類 java.lang.Object 繼承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
public ProcessBuilder(ListString command)
使用指定的操作系統(tǒng)程序和參數(shù)構(gòu)造一個(gè)進(jìn)程構(gòu)建器。 此構(gòu)造函數(shù)不會(huì)復(fù)制命令列表。 列表的后續(xù)更新將反映在流程構(gòu)建器的狀態(tài)中。 不檢查命令是否對(duì)應(yīng)于有效的操作系統(tǒng)命令。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
command | 包含程序及其參數(shù)的列表 |
Throws:
Throw名稱 | Throw描述 |
---|---|
NullPointerException | 如果參數(shù)為空 |
public ProcessBuilder(String... command)
使用指定的操作系統(tǒng)程序和參數(shù)構(gòu)造一個(gè)進(jìn)程構(gòu)建器。 這是一個(gè)方便的構(gòu)造函數(shù),它將進(jìn)程構(gòu)建器的命令設(shè)置為一個(gè)字符串列表,其中包含與命令數(shù)組相同的字符串,順序相同。 不檢查命令是否對(duì)應(yīng)于有效的操作系統(tǒng)命令。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
command | 包含程序及其參數(shù)的字符串?dāng)?shù)組 |
public ProcessBuilder command(ListString command)
設(shè)置此進(jìn)程構(gòu)建器的操作系統(tǒng)程序和參數(shù)。 此方法不會(huì)復(fù)制命令列表。 列表的后續(xù)更新將反映在流程構(gòu)建器的狀態(tài)中。 不檢查命令是否對(duì)應(yīng)于有效的操作系統(tǒng)命令。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
command | 包含程序及其參數(shù)的列表 |
返回:
此流程構(gòu)建器
Throws:
Throw名稱 | Throw描述 |
---|---|
NullPointerException | 如果參數(shù)為空 |
public ProcessBuilder command(String... command)
設(shè)置此進(jìn)程構(gòu)建器的操作系統(tǒng)程序和參數(shù)。 這是一種方便的方法,它將命令設(shè)置為一個(gè)字符串列表,其中包含與命令數(shù)組相同的字符串,順序相同。 不檢查命令是否對(duì)應(yīng)于有效的操作系統(tǒng)命令。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
command | 包含程序及其參數(shù)的字符串?dāng)?shù)組 |
返回:
此流程構(gòu)建器
public ListString command()
返回此進(jìn)程構(gòu)建器的操作系統(tǒng)程序和參數(shù)。 返回的列表不是副本。 列表的后續(xù)更新將反映在此流程構(gòu)建器的狀態(tài)中。
返回:
此流程構(gòu)建器的程序及其參數(shù)
public MapString,String environment()
返回此流程構(gòu)建器環(huán)境的字符串映射視圖。每當(dāng)創(chuàng)建流程構(gòu)建器時(shí),都會(huì)將環(huán)境初始化為當(dāng)前流程環(huán)境的副本(請(qǐng)參閱 System#getenv())。隨后由該對(duì)象的 start() 方法啟動(dòng)的子進(jìn)程將使用該映射作為它們的環(huán)境。
返回的對(duì)象可以使用普通的 Map 操作進(jìn)行修改。這些修改將對(duì)通過 start() 方法啟動(dòng)的子進(jìn)程可見。兩個(gè) ProcessBuilder 實(shí)例始終包含獨(dú)立的流程環(huán)境,因此對(duì)返回映射的更改將永遠(yuǎn)不會(huì)反映在任何其他 ProcessBuilder 實(shí)例或 System#getenv 返回的值中。
如果系統(tǒng)不支持環(huán)境變量,則返回一個(gè)空映射。
返回的映射不允許空鍵或值。嘗試插入或查詢是否存在空鍵或值將引發(fā) NullPointerException。嘗試查詢是否存在非 String 類型的鍵或值將引發(fā) ClassCastException。
返回地圖的行為取決于系統(tǒng)。系統(tǒng)可能不允許修改環(huán)境變量或可能禁止某些變量名稱或值。因此,如果操作系統(tǒng)不允許修改,嘗試修改映射可能會(huì)失敗并出現(xiàn) UnsupportedOperationException 或 IllegalArgumentException。
由于環(huán)境變量名稱和值的外部格式取決于系統(tǒng),因此它們與 Java 的 Unicode 字符串之間可能沒有一對(duì)一的映射。盡管如此,映射的實(shí)現(xiàn)方式是,未由 Java 代碼修改的環(huán)境變量將在子進(jìn)程中具有未修改的本機(jī)表示。
返回的地圖及其集合視圖可能不遵守 Object#equals 和 Object#hashCode 方法的一般約定。
返回的地圖通常在所有平臺(tái)上都區(qū)分大小寫。
如果存在安全管理器,則使用 RuntimePermission("getenv.*") 權(quán)限調(diào)用其 SecurityManager#checkPermission 方法。這可能會(huì)導(dǎo)致拋出 SecurityException。
將信息傳遞給 Java 子進(jìn)程時(shí),系統(tǒng)屬性通常優(yōu)于環(huán)境變量。
返回:
此流程構(gòu)建器的環(huán)境
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 SecurityManager#checkPermission 方法不允許訪問進(jìn)程環(huán)境 |
public File directory()
返回此流程構(gòu)建器的工作目錄。 隨后由該對(duì)象的 start() 方法啟動(dòng)的子進(jìn)程將使用它作為其工作目錄。 返回值可能為null——表示使用當(dāng)前Java進(jìn)程的工作目錄,通常是系統(tǒng)屬性u(píng)ser.dir命名的目錄,作為子進(jìn)程的工作目錄。
返回:
此流程構(gòu)建器的工作目錄
public ProcessBuilder directory(File directory)
設(shè)置此流程構(gòu)建器的工作目錄。 隨后由該對(duì)象的 start() 方法啟動(dòng)的子進(jìn)程將使用它作為其工作目錄。 參數(shù)可以為null——表示使用當(dāng)前Java進(jìn)程的工作目錄,通常是系統(tǒng)屬性u(píng)ser.dir命名的目錄,作為子進(jìn)程的工作目錄。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
directory | 新的工作目錄 |
返回:
此流程構(gòu)建器
public ProcessBuilder redirectInput(ProcessBuilder.Redirect source)
設(shè)置此流程構(gòu)建器的標(biāo)準(zhǔn)輸入源。 隨后由該對(duì)象的 start() 方法啟動(dòng)的子進(jìn)程從此源獲取其標(biāo)準(zhǔn)輸入。
如果源是 Redirect#PIPE(初始值),則可以使用 Process#getOutputStream() 返回的輸出流寫入子進(jìn)程的標(biāo)準(zhǔn)輸入。 如果源設(shè)置為任何其他值,則 Process#getOutputStream() 將返回一個(gè)空輸出流。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
source | 新的標(biāo)準(zhǔn)輸入源 |
返回:
此流程構(gòu)建器
Throws:
Throw名稱 | Throw描述 |
---|---|
IllegalArgumentException | 如果重定向不對(duì)應(yīng)于有效的數(shù)據(jù)源,即類型為 WRITE 或 APPEND |
public ProcessBuilder redirectOutput(ProcessBuilder.Redirect destination)
設(shè)置此流程構(gòu)建器的標(biāo)準(zhǔn)輸出目標(biāo)。 隨后由該對(duì)象的 start() 方法啟動(dòng)的子進(jìn)程將其標(biāo)準(zhǔn)輸出發(fā)送到該目的地。
如果目標(biāo)是 Redirect#PIPE(初始值),則可以使用 Process#getInputStream() 返回的輸入流讀取子進(jìn)程的標(biāo)準(zhǔn)輸出。 如果目標(biāo)設(shè)置為任何其他值,則 Process#getInputStream() 將返回一個(gè)空輸入流。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
destination | 新的標(biāo)準(zhǔn)輸出目的地 |
返回:
此流程構(gòu)建器
Throws:
Throw名稱 | Throw描述 |
---|---|
IllegalArgumentException | 如果重定向不對(duì)應(yīng)于數(shù)據(jù)的有效目的地,即類型為 READ |
public ProcessBuilder redirectError(ProcessBuilder.Redirect destination)
設(shè)置此流程構(gòu)建器的標(biāo)準(zhǔn)錯(cuò)誤目標(biāo)。 隨后由該對(duì)象的 start() 方法啟動(dòng)的子進(jìn)程將其標(biāo)準(zhǔn)錯(cuò)誤發(fā)送到該目的地。
如果目標(biāo)是 Redirect#PIPE(初始值),則可以使用 Process#getErrorStream() 返回的輸入流讀取子進(jìn)程的錯(cuò)誤輸出。 如果目標(biāo)設(shè)置為任何其他值,則 Process#getErrorStream() 將返回空輸入流。
如果redirectErrorStream 屬性已設(shè)置為true,則此方法設(shè)置的重定向無效。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
destination | 新的標(biāo)準(zhǔn)錯(cuò)誤目的地 |
返回:
此流程構(gòu)建器
Throws:
Throw名稱 | Throw描述 |
---|---|
IllegalArgumentException | 如果重定向不對(duì)應(yīng)于數(shù)據(jù)的有效目的地,即類型為 READ |
public ProcessBuilder redirectInput(File file)
將此流程構(gòu)建器的標(biāo)準(zhǔn)輸入源設(shè)置為文件。
這是一種方便的方法。 形式redirectInput(file) 的調(diào)用與調(diào)用redirectInput (Redirect.from(file)) 的行為方式完全相同。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
file | 新的標(biāo)準(zhǔn)輸入源 |
返回:
此流程構(gòu)建器
public ProcessBuilder redirectOutput(File file)
將此流程構(gòu)建器的標(biāo)準(zhǔn)輸出目標(biāo)設(shè)置為文件。
這是一種方便的方法。 形式redirectOutput(file) 的調(diào)用與調(diào)用redirectOutput (Redirect.to(file)) 的行為方式完全相同。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
file | 新的標(biāo)準(zhǔn)輸出目的地 |
返回:
此流程構(gòu)建器
public ProcessBuilder redirectError(File file)
將此流程構(gòu)建器的標(biāo)準(zhǔn)錯(cuò)誤目標(biāo)設(shè)置為文件。
這是一種方便的方法。 調(diào)用redirectError(file) 形式的行為與調(diào)用redirectError (Redirect.to(file)) 完全相同。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
file | 新的標(biāo)準(zhǔn)錯(cuò)誤目的地 |
返回:
此流程構(gòu)建器
public ProcessBuilder.Redirect redirectInput()
返回此流程構(gòu)建器的標(biāo)準(zhǔn)輸入源。 隨后由該對(duì)象的 start() 方法啟動(dòng)的子進(jìn)程從此源獲取其標(biāo)準(zhǔn)輸入。 初始值為重定向#PIPE。
返回:
此流程構(gòu)建器的標(biāo)準(zhǔn)輸入源
public ProcessBuilder.Redirect redirectOutput()
返回此流程構(gòu)建器的標(biāo)準(zhǔn)輸出目標(biāo)。 隨后由該對(duì)象的 start() 方法啟動(dòng)的子進(jìn)程將其標(biāo)準(zhǔn)輸出重定向到該目的地。 初始值為重定向#PIPE。
返回:
此流程構(gòu)建器的標(biāo)準(zhǔn)輸出目的地
public ProcessBuilder.Redirect redirectError()
返回此流程構(gòu)建器的標(biāo)準(zhǔn)錯(cuò)誤目標(biāo)。 隨后由該對(duì)象的 start() 方法啟動(dòng)的子進(jìn)程將其標(biāo)準(zhǔn)錯(cuò)誤重定向到該目的地。 初始值為重定向#PIPE。
返回:
此流程構(gòu)建器的標(biāo)準(zhǔn)錯(cuò)誤目的地
public ProcessBuilder inheritIO()
將子進(jìn)程標(biāo)準(zhǔn) I/O 的源和目標(biāo)設(shè)置為與當(dāng)前 Java 進(jìn)程的相同。
這是一種方便的方法。 表單的調(diào)用
pb.inheritIO()
行為方式與調(diào)用完全相同
pb.redirectInput(Redirect.INHERIT) .redirectOutput(Redirect.INHERIT) .redirectError(Redirect.INHERIT)
這提供了相當(dāng)于大多數(shù)操作系統(tǒng)命令解釋器或標(biāo)準(zhǔn) C 庫函數(shù) system() 的行為。
返回:
此流程構(gòu)建器
public boolean redirectErrorStream()
告知此流程構(gòu)建器是否合并標(biāo)準(zhǔn)錯(cuò)誤和標(biāo)準(zhǔn)輸出。
如果此屬性為true,則隨后由該對(duì)象的 start() 方法啟動(dòng)的子進(jìn)程生成的任何錯(cuò)誤輸出都將與標(biāo)準(zhǔn)輸出合并,以便可以使用 Process#getInputStream() 方法讀取兩者。 這使得更容易將錯(cuò)誤消息與相應(yīng)的輸出相關(guān)聯(lián)。 初始值為false。
返回:
此流程構(gòu)建器的 redirectErrorStream 屬性
public ProcessBuilder redirectErrorStream(boolean redirectErrorStream)
設(shè)置此流程構(gòu)建器的 redirectErrorStream 屬性。
如果此屬性為true,則隨后由該對(duì)象的 start() 方法啟動(dòng)的子進(jìn)程生成的任何錯(cuò)誤輸出都將與標(biāo)準(zhǔn)輸出合并,以便可以使用 Process#getInputStream() 方法讀取兩者。 這使得更容易將錯(cuò)誤消息與相應(yīng)的輸出相關(guān)聯(lián)。 初始值為false。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
redirectErrorStream | 新的屬性值 |
返回:
此流程構(gòu)建器
public Process start() throws IOException
使用此流程構(gòu)建器的屬性啟動(dòng)一個(gè)新流程。
新進(jìn)程將在由 directory() 給出的工作目錄中調(diào)用由 command() 給出的命令和參數(shù),以及由 environment() 給出的進(jìn)程環(huán)境。
此方法檢查該命令是否為有效的操作系統(tǒng)命令。哪些命令有效取決于系統(tǒng),但至少該命令必須是非空字符串的非空列表。
在某些操作系統(tǒng)上啟動(dòng)進(jìn)程可能需要一組最小的系統(tǒng)相關(guān)環(huán)境變量。因此,子流程可能會(huì)繼承流程構(gòu)建器的 environment() 之外的其他環(huán)境變量設(shè)置。
如果存在安全管理器,則調(diào)用其 SecurityManager#checkExec 方法,并使用此對(duì)象的命令數(shù)組的第一個(gè)組件作為其參數(shù)。這可能會(huì)導(dǎo)致拋出 SecurityException。
啟動(dòng)操作系統(tǒng)進(jìn)程高度依賴于系統(tǒng)。可能出錯(cuò)的許多事情包括:
在這種情況下會(huì)拋出異常。 異常的確切性質(zhì)取決于系統(tǒng),但它始終是 IOException 的子類。
對(duì)此流程構(gòu)建器的后續(xù)修改不會(huì)影響返回的流程。
返回:
用于管理子流程的新流程對(duì)象
Throws:
Throw名稱 | Throw描述 |
---|---|
NullPointerException | 如果命令列表的元素為空 |
IndexOutOfBoundsException | 如果命令是一個(gè)空列表(大小為 0) |
SecurityException | 如果存在安全管理器并且其 SecurityManager#checkExec 方法不允許創(chuàng)建子進(jìn)程,或者子進(jìn)程的標(biāo)準(zhǔn)輸入從文件重定向并且安全管理器的 SecurityManager#checkRead 方法拒絕讀取文件,或者標(biāo)準(zhǔn)輸出或標(biāo)準(zhǔn) 子進(jìn)程的錯(cuò)誤被重定向到文件并且安全管理器的 SecurityManager#checkWrite 方法拒絕對(duì)文件的寫訪問 |
IOException | 如果發(fā)生 I/O 錯(cuò)誤 |
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: