public final class ProcessBuilder extends Object
每个ProcessBuilder
实例管理进程属性的集合。 start()
方法使用这些属性创建一个新的Process
实例。 start()
方法可以从同一实例重复调用,以创建具有相同或相关属性的新子进程。
每个进程构建器管理这些进程属性:
System.getenv()
)。 user.dir
命名的user.dir
。 Process.getOutputStream()
返回的输出流访问此管道。 然而,标准的输入可被重定向到使用另一来源redirectInput
。 在这种情况下, Process.getOutputStream()
将返回一个空输出流 ,其中:
Process.getInputStream()
和Process.getErrorStream()
返回的输入流访问这些管道。 然而,使用redirectOutput
和redirectError
可以将标准输出和标准错误重定向到其他目的地 。 在这种情况下, Process.getInputStream()
和/或Process.getErrorStream()
将返回一个空输入流 ,其中:
false
,这意味着子过程的标准输出和错误输出将发送到两个独立的流,可以使用Process.getInputStream()
和Process.getErrorStream()
方法访问。 如果值设置为true
,则:
redirectOutput
重定向 redirectError
方法设置的任何重定向在创建子进程时将被忽略 Process.getErrorStream()
返回的流将始终是null input stream 修改流程构建器的属性将影响随后由该对象的start()
方法启动的进程 ,但不会影响以前启动的进程或Java进程本身。
大多数错误检查由start()
方法执行。 可以修改对象的状态,使得start()
将失败。 例如,将命令属性设置为空列表将不会抛出异常,除非调用start()
。
请注意,此类不同步。 如果多个线程并发访问一个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")); 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;
首先明确设置环境变量,第一个电话的过程Map.clear()
添加环境变量之前。
Modifier and Type | Class and Description |
---|---|
static class |
ProcessBuilder.Redirect
表示子进程输入的源或子进程输出的目的地。
|
Constructor and Description |
---|
ProcessBuilder(List<String> command)
构造具有指定操作系统程序和参数的进程构建器。
|
ProcessBuilder(String... command)
构造具有指定操作系统程序和参数的进程构建器。
|
Modifier and Type | Method and Description |
---|---|
List<String> |
command()
返回此流程构建器的操作系统程序和参数。
|
ProcessBuilder |
command(List<String> command)
设置此流程构建器的操作系统程序和参数。
|
ProcessBuilder |
command(String... command)
设置此流程构建器的操作系统程序和参数。
|
File |
directory()
返回此进程构建器的工作目录。
|
ProcessBuilder |
directory(File directory)
设置此进程构建器的工作目录。
|
Map<String,String> |
environment()
返回此流程构建器环境的字符串映射视图。
|
ProcessBuilder |
inheritIO()
将子进程标准I / O的源和目标设置为与当前Java进程相同。
|
ProcessBuilder.Redirect |
redirectError()
返回此流程构建器的标准错误目标。
|
ProcessBuilder |
redirectError(File file)
将此流程构建器的标准错误目标设置为文件。
|
ProcessBuilder |
redirectError(ProcessBuilder.Redirect destination)
设置此流程构建器的标准错误目标。
|
boolean |
redirectErrorStream()
告诉这个进程构建器是否合并标准错误和标准输出。
|
ProcessBuilder |
redirectErrorStream(boolean redirectErrorStream)
设置此过程构建器的
redirectErrorStream 属性。
|
ProcessBuilder.Redirect |
redirectInput()
返回此流程构建器的标准输入源。
|
ProcessBuilder |
redirectInput(File file)
将此流程构建器的标准输入源设置为文件。
|
ProcessBuilder |
redirectInput(ProcessBuilder.Redirect source)
设置此流程构建器的标准输入源。
|
ProcessBuilder.Redirect |
redirectOutput()
返回此流程构建器的标准输出目标。
|
ProcessBuilder |
redirectOutput(File file)
将此流程构建器的标准输出目标设置为文件。
|
ProcessBuilder |
redirectOutput(ProcessBuilder.Redirect destination)
设置此流程构建器的标准输出目标。
|
Process |
start()
使用此流程构建器的属性启动新进程。
|
public ProcessBuilder(List<String> command)
command
列表的副本。
列表的后续更新将反映在流程构建器的状态。
不检查command
是否command
于有效的操作系统命令。
command
- 包含程序及其参数的列表
NullPointerException
- 如果参数为空
public ProcessBuilder(String... command)
command
函数,它以相同的顺序将流程构建器的命令设置为包含与command
数组相同的字符串的字符串列表。
不检查command
是否command
于有效的操作系统命令。
command
- 一个包含程序及其参数的字符串数组
public ProcessBuilder command(List<String> command)
command
列表的副本。
列表的后续更新将反映在流程构建器的状态。
不检查command
是否command
于有效的操作系统命令。
command
- 包含程序及其参数的列表
NullPointerException
- 如果参数为null
public ProcessBuilder command(String... command)
command
数组相同的字符串的字符串列表,顺序相同。
不检查command
是否command
于有效的操作系统命令。
command
- 包含程序及其参数的字符串数组
public List<String> command()
public Map<String,String> environment()
System.getenv()
)。
随后由此对象的start()
方法开始的子处理将使用此映射作为其环境。
可以使用普通的Map
操作修改返回的对象。 这些修改对于通过start()
方法启动的子进程将是可见的。 两个ProcessBuilder
实例始终包含独立的进程环境,因此对返回的映射的更改永远不会反映在任何其他ProcessBuilder
实例或System.getenv
返回的值中。
如果系统不支持环境变量,则返回空的地图。
返回的映射不允许空值或值。 尝试插入或查询空键或值的存在将抛出一个NullPointerException
。 试图查询一个不是String
类型的键或值的存在将会抛出一个ClassCastException
。
返回地图的行为依赖于系统。 系统可能不允许修改环境变量或禁止某些变量名称或值。 因此,如果操作系统不允许修改,则尝试修改映射可能会失败, UnsupportedOperationException
或IllegalArgumentException
。
由于环境变量名称和值的外部格式与系统相关,因此可能与Java的Unicode字符串之间不存在一对一的映射。 然而,地图的实现方式是,未被Java代码修改的环境变量将在子进程中具有未修改的本地表示。
返回的地图及其收藏意见可能不符合Object.equals(java.lang.Object)
和Object.hashCode()
方法的一般合同。
返回的地图通常在所有平台上都区分大小写。
如果一个安全管理器存在,它的checkPermission
方法被调用一个RuntimePermission
("getenv.*")
权限。 这可能会导致SecurityException
被抛出。
当将信息传递给Java子进程时,通常优先于环境变量system properties。
SecurityException
- 如果存在安全管理员,并且其
checkPermission
方法不允许访问进程环境
Runtime.exec(String[],String[],java.io.File)
,
System.getenv()
public File directory()
start()
方法启动的子进程将使用此作为其工作目录。
返回的值可能是null
- 这意味着使用当前Java进程的工作目录,通常由系统属性user.dir
命名的user.dir
作为子进程的工作目录。
public ProcessBuilder directory(File directory)
start()
方法开始的子进程将使用此作为其工作目录。
参数可能是null
- 这意味着使用当前Java进程的工作目录,通常将系统属性user.dir
命名的user.dir
作为子进程的工作目录。
directory
- 新的工作目录
public ProcessBuilder redirectInput(ProcessBuilder.Redirect source)
start()
方法启动,从该源获取其标准输入。
如果源为Redirect.PIPE
(初始值),则可以使用Process.getOutputStream()
返回的输出流将子进程的标准输入写入。 如果源设置为任何其他值,那么Process.getOutputStream()
将返回一个null output stream 。
source
- 新的标准输入源
IllegalArgumentException
- 如果重定向不对应于有效的数据源,即具有类型
WRITE
或
APPEND
public ProcessBuilder redirectOutput(ProcessBuilder.Redirect destination)
start()
方法启动,将其标准输出发送到此目标。
如果目的地为Redirect.PIPE
(初始值),则可以使用Process.getInputStream()
返回的输入流读取子过程的标准输出。 如果目的地设置为任何其他值,那么Process.getInputStream()
将返回一个null input stream 。
destination
- 新的标准输出目的地
IllegalArgumentException
- 如果重定向不对应于有效的数据目的地,也就是具有类型
READ
public ProcessBuilder redirectError(ProcessBuilder.Redirect destination)
start()
方法启动,将其标准错误发送到此目标。
如果目的地为Redirect.PIPE
(初始值),则可以使用Process.getErrorStream()
返回的输入流读取子进程的错误输出。 如果目的地设置为任何其他值,那么Process.getErrorStream()
将返回一个null input stream 。
如果redirectErrorStream
属性已设置为true
,则此方法设置的重定向没有任何作用。
destination
- 新的标准错误目的地
IllegalArgumentException
- 如果重定向不对应于有效的数据目的地,也就是具有类型
READ
public ProcessBuilder redirectInput(File file)
这是一种方便的方法。 redirectInput(file)表单的redirectInput(file)
方式与调用redirectInput
(Redirect.from(file))
。
file
- 新的标准输入源
public ProcessBuilder redirectOutput(File file)
这是一种方便的方法。 redirectOutput(file)表单的redirectOutput(file)
方式与调用redirectOutput
(Redirect.to(file))
。
file
- 新的标准输出目的地
public ProcessBuilder redirectError(File file)
这是一种方便的方法。 表单redirectError(file)
行为方式与调用redirectError
(Redirect.to(file))
。
file
- 新的标准错误目的地
public ProcessBuilder.Redirect redirectInput()
public ProcessBuilder.Redirect redirectOutput()
public ProcessBuilder.Redirect redirectError()
public ProcessBuilder inheritIO()
这是一种方便的方法。 调用表单
pb.inheritIO()
行为与调用完全相同
pb.redirectInput(Redirect.INHERIT) .redirectOutput(Redirect.INHERIT) .redirectError(Redirect.INHERIT)
这给出了与大多数操作系统命令解释器相同的行为,或标准C库函数system()
。
public boolean redirectErrorStream()
如果此属性为true
,则由该对象的start()
方法随后启动的子处理生成的任何错误输出将与标准输出合并,以便可以使用Process.getInputStream()
方法读取。 这使得更容易将错误消息与相应的输出相关联。 初始值为false
。
redirectErrorStream
属性
public ProcessBuilder redirectErrorStream(boolean redirectErrorStream)
redirectErrorStream
属性。
如果此属性为true
,则由该对象的start()
方法随后启动的子处理生成的任何错误输出将与标准输出合并,以便可以使用Process.getInputStream()
方法读取。 这使得更容易将错误消息与相应的输出相关联。 初始值为false
。
redirectErrorStream
- 新的属性值
public Process start() throws IOException
新进程将调用由指定的命令和参数command()
按以下给出,在工作目录directory()
,有一个过程的环境被给出environment()
。
该方法检查该命令是否为有效的操作系统命令。 哪些命令有效是依赖于系统的,但至少该命令必须是非空字符串的非空列表。
在某些操作系统上启动一个进程可能需要一小部分与系统相关的环境变量。 因此,子进程可能会继承其他环境变量设置,而不是进程生成器的environment()
。
如果有安全管理器,则使用该对象的command
数组的第一个组件作为参数来调用其checkExec
方法。 这可能会导致SecurityException
被抛出。
启动操作系统进程与系统相关。 许多可能出错的事情是:
在这种情况下,会抛出异常。 异常的确切性质是系统依赖的,但它始终是IOException
的子类。
此过程构建器的后续修改不会影响返回的Process
。
Process
对象
NullPointerException
- 如果命令列表的元素为空
IndexOutOfBoundsException
- 如果命令是空列表(具有大小
0
)
SecurityException
- 如果存在安全管理员,
checkExec
方法不允许创建子进程,或者 checkRead
方法拒绝对该文件的读访问,或 checkWrite
方法拒绝对文件的写入访问 IOException
- 如果发生I / O错误
Runtime.exec(String[], String[], java.io.File)