public final class ProcessBuilder
extends Object
java.lang.Object | |
↳ | java.lang.ProcessBuilder |
这个类用于创建操作系统进程。
每个ProcessBuilder
实例管理一组进程属性。 start()
方法使用这些属性创建一个新的Process
实例。 可以从同一实例重复调用start()
方法,以创建具有相同或相关属性的新子start()
。
每个流程构建器管理这些流程属性:
getenv()
). user.dir
. 修改进程生成器的属性将影响后续由该对象的开始过程 start()
方法,但绝不会影响以前启动的进程或Java程序本身。
大多数错误检查由start()
方法执行。 可以修改对象的状态,以便start()
失败。 例如,除非调用start()
否则将command属性设置为空列表不会引发异常。
请注意,这个类不同步。 如果多个线程同时访问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(new File("myDir"));
Process p = pb.start();
要使用一组显式的环境变量启动进程,请在添加环境变量之前先调用 Map.clear()
。
Public constructors |
|
---|---|
ProcessBuilder(List<String> command) 用指定的操作系统程序和参数构造一个流程构建器。 |
|
ProcessBuilder(String... command) 用指定的操作系统程序和参数构造一个流程构建器。 |
Public methods |
|
---|---|
List<String> |
command() 返回此流程构建器的操作系统程序和参数。 |
ProcessBuilder |
command(String... command) 设置此进程生成器的操作系统程序和参数。 |
ProcessBuilder |
command(List<String> command) 设置此进程生成器的操作系统程序和参数。 |
File |
directory() 返回此流程构建器的工作目录。 |
ProcessBuilder |
directory(File directory) 设置此进程生成器的工作目录。 |
Map<String, String> |
environment() 返回此进程生成器环境的字符串映射视图。 |
boolean |
redirectErrorStream() 告诉这个进程生成器是否合并标准错误和标准输出。 |
ProcessBuilder |
redirectErrorStream(boolean redirectErrorStream) 设置此进程生成器的 |
Process |
start() 使用此流程构建器的属性启动新流程。 |
Inherited methods |
|
---|---|
From class java.lang.Object
|
ProcessBuilder (List<String> command)
用指定的操作系统程序和参数构造一个流程构建器。 此构造不会使副本command
列表。 对列表的后续更新将反映在流程构建器的状态中。 不检查command
是否对应于有效的操作系统命令。
Parameters | |
---|---|
command |
List : the list containing the program and its arguments |
Throws | |
---|---|
NullPointerException |
if the argument is null |
ProcessBuilder (String... command)
用指定的操作系统程序和参数构造一个流程构建器。 这是一个便利的构造函数,它将进程构建器的命令设置为包含与command
数组相同的字符串的字符串列表,顺序相同。 不检查command
是否对应于有效的操作系统命令。
Parameters | |
---|---|
command |
String : a string array containing the program and its arguments |
List<String> command ()
返回此流程构建器的操作系统程序和参数。 返回的列表不是副本。 此列表的后续更新将反映在此流程构建器的状态中。
Returns | |
---|---|
List<String> |
this process builder's program and its arguments |
ProcessBuilder command (String... command)
设置此进程生成器的操作系统程序和参数。 这是一种方便的方法,它按照相同的顺序将命令设置为包含与command
数组相同的字符串的字符串列表。 不检查command
是否对应于有效的操作系统命令。
Parameters | |
---|---|
command |
String : a string array containing the program and its arguments |
Returns | |
---|---|
ProcessBuilder |
this process builder |
ProcessBuilder command (List<String> command)
设置此进程生成器的操作系统程序和参数。 这种方法不会使副本command
列表。 对列表的后续更新将反映在流程构建器的状态中。 不检查command
是否对应于有效的操作系统命令。
Parameters | |
---|---|
command |
List : the list containing the program and its arguments |
Returns | |
---|---|
ProcessBuilder |
this process builder |
Throws | |
---|---|
NullPointerException |
if the argument is null |
File directory ()
返回此流程构建器的工作目录。 随后由该对象的start()
方法启动的子start()
将使用此作为其工作目录。 返回的值可能是null
- 这意味着将当前Java进程的工作目录(通常是由系统属性user.dir
命名的目录)用作子进程的工作目录。
Returns | |
---|---|
File |
this process builder's working directory |
ProcessBuilder directory (File directory)
设置此进程生成器的工作目录。 随后由此对象的start()
方法启动的子start()
将使用此作为其工作目录。 参数可以是null
- 这意味着将当前Java进程的工作目录(通常是由系统属性user.dir
命名的目录)用作子进程的工作目录。
Parameters | |
---|---|
directory |
File : the new working directory |
Returns | |
---|---|
ProcessBuilder |
this process builder |
Map<String, String> environment ()
返回此进程生成器环境的字符串映射视图。 无论何时创建过程构建器,环境都会初始化为当前过程环境的副本(请参阅getenv()
)。 随后由此对象的start()
方法启动的子过程将使用此地图作为其环境。
返回的对象可以使用普通的Map
操作进行修改。 通过start()
方法启动的子流程可以看到这些修改。 两个ProcessBuilder
实例始终包含独立的进程环境,因此更改返回的映射将永远不会反映到其他任何ProcessBuilder
实例或System.getenv
返回的值中。
如果系统不支持环境变量,则返回空映射。
返回的映射不允许空键或值。 尝试插入或查询空键或值的存在将抛出NullPointerException
。 试图查询非String
类型的键或值的存在将抛出ClassCastException
。
返回的地图的行为是依赖于系统的。 系统可能不允许修改环境变量或可能禁止某些变量名称或值。 因此,如果操作系统不允许修改,则尝试修改映射可能会失败,并显示UnsupportedOperationException
或IllegalArgumentException
。
由于环境变量名称和值的外部格式是依赖于系统的,因此它们与Java的Unicode字符串之间可能没有一对一的映射关系。 尽管如此,映射的实现方式是,未由Java代码修改的环境变量在子流程中将具有未修改的本地表示。
返回的地图及其收集视图可能不服从 equals(Object)
和 hashCode()
方法的总体合同。
返回的映射在所有平台上通常都区分大小写。
如果安全管理器存在,则使用RuntimePermission
("getenv.*")
权限调用其checkPermission
方法。 这可能会导致SecurityException
被抛出。
将信息传递给Java子 进程时 ,通常优先于环境变量 system properties 。
Returns | |
---|---|
Map<String, String> |
this process builder's environment |
Throws | |
---|---|
SecurityException |
if a security manager exists and its checkPermission method doesn't allow access to the process environment |
boolean redirectErrorStream ()
告诉这个进程生成器是否合并标准错误和标准输出。
如果此属性为true
,则随后由此对象的start()
方法启动的子true
生成的任何错误输出将与标准输出合并,以便可以使用getInputStream()
方法读取这两者。 这样可以更容易地将错误消息与相应的输出相关联。 初始值是false
。
Returns | |
---|---|
boolean |
this process builder's redirectErrorStream property |
ProcessBuilder redirectErrorStream (boolean redirectErrorStream)
设置此进程生成器的 redirectErrorStream
属性。
如果此属性为true
,则随后由此对象的start()
方法启动的子true
生成的任何错误输出将与标准输出合并,以便可以使用getInputStream()
方法读取这两者。 这样可以更容易地将错误消息与相应的输出相关联。 初始值是false
。
Parameters | |
---|---|
redirectErrorStream |
boolean : the new property value |
Returns | |
---|---|
ProcessBuilder |
this process builder |
Process start ()
使用此流程构建器的属性启动新流程。
新进程将调用由指定的命令和参数 command()
按以下给出,在工作目录 directory()
,有一个过程的环境被给出 environment()
。
此方法检查该命令是否是有效的操作系统命令。 哪些命令是有效的取决于系统,但至少该命令必须是非空字符串的非空列表。
在某些操作系统上启动进程可能需要一组最小系统相关环境变量。 因此,子进程可能会继承进程构建器environment()
以外的其他环境变量设置。
如果有安全管理器,则使用此对象的command
数组的第一个组件作为其参数调用其checkExec
方法。 这可能会导致SecurityException
被抛出。
启动操作系统进程是高度依赖于系统的。 许多可能出错的事情包括:
在这种情况下,将抛出异常。 异常的确切性质取决于系统,但始终是IOException
的子类。
对此进程生成器的后续修改不会影响返回的 Process
。
Returns | |
---|---|
Process |
a new Process object for managing the subprocess |
Throws | |
---|---|
NullPointerException |
if an element of the command list is null |
IndexOutOfBoundsException |
if the command is an empty list (has size 0 ) |
SecurityException |
if a security manager exists and
|
IOException |
if an I/O error occurs |