public final class ProcessBuilder extends Object
每个ProcessBuilder
实例管理过程的集合属性。的start()
方法创建一个新的Process
实例的属性。的start()
方法可以调用多次从同一实例的创建具有相同或相关属性的新阶段。
每个进程生成器管理这些过程属性:
System.getenv()
)。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
含程序和参数列表
NullPointerException
-如果参数为空
public ProcessBuilder(String... command)
command
阵列,以相同的顺序。它不检查是否
command
对应一个有效的操作系统命令。
command
-一个包含程序及其参数的字符串数组
public ProcessBuilder command(List<String> command)
command
列表。列表的后续更新将在进程生成器的状态中反映出来。它不检查是否
command
对应一个有效的操作系统命令。
command
含程序和参数列表
NullPointerException
-如果参数为空
public ProcessBuilder command(String... command)
command
阵列,以相同的顺序。它不检查是否
command
对应一个有效的操作系统命令。
command
-一个包含程序及其参数的字符串数组
public List<String> command()
public Map<String,String> environment()
System.getenv()
)。可随后开始这个对象的
start()
方法将使用此Map作为环境。
返回的对象可以使用普通的Map
操作的改进。这些修改将是可见的子过程开始通过start()
方法。两ProcessBuilder
实例总是包含独立的过程中,因此返回的Map的变化不会反映在其他ProcessBuilder
实例或返回的值System.getenv
。
如果系统不支持环境变量,则返回一个空的Map。
返回的Map不允许空键或值。试图插入或查询一个空键或值的存在将NullPointerException
。试图查询一个键或值类型不是String
的存在将ClassCastException
。
返回的映射的行为是依赖于系统的。系统可能不允许对环境变量的修改,或可能禁止某些变量的名称或值。为此,试图修改Map可能会失败,UnsupportedOperationException
或IllegalArgumentException
如果由操作系统不允许修改。
由于环境变量的名称和值的外部格式是系统相关的,不可能有他们和java的Unicode字符串之间一对一的映射。然而,Map是在这样一个环境变量,不是由java代码修改将在子未修改的本地表示实施。
返回的Map和收集的意见可能不服从的Object.equals(java.lang.Object)
和Object.hashCode()
方法一般合同。
返回的Map通常是在所有平台上敏感的情况下。
如果存在一个安全管理,其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
命名,作为子进程的工作目录。
public ProcessBuilder directory(File directory)
start()
方法将使用这个作为自己的工作目录。参数可以是
null
--这意味着利用现有的java进程的工作目录的目录,通常由系统性
user.dir
命名,作为子进程的工作目录。
directory
-新的工作目录
public ProcessBuilder redirectInput(ProcessBuilder.Redirect source)
start()
方法从源获取标准输入。
如果源是Redirect.PIPE
(初始值),然后子进程的标准输入可以写入到输出流Process.getOutputStream()
使用返回的。如果源设置为其他值,然后返回一个null output stream Process.getOutputStream()
。
source
-新标准输入源
IllegalArgumentException
如果重定向无效数据,这是源,有
WRITE
型或
APPEND
public ProcessBuilder redirectOutput(ProcessBuilder.Redirect destination)
start()
方法把标准输出到目的地。
如果目标是Redirect.PIPE
(初始值),然后子进程的标准输出可以使用返回的Process.getInputStream()
输入流中读取。如果目标设置为其他值,然后返回一个null input stream Process.getInputStream()
。
destination
-新标准输出目的地
IllegalArgumentException
如果重定向并没有对应的数据,这是一个有效的目标,有
READ
型
public ProcessBuilder redirectError(ProcessBuilder.Redirect destination)
start()
方法送他们到目的地的标准误差。
如果目标是Redirect.PIPE
(初始值),然后子进程的错误输出可以使用输入流读取返回的Process.getErrorStream()
。如果目标设置为其他值,然后返回一个null input stream Process.getErrorStream()
。
如果redirectErrorStream
属性已设置true
,然后重定向设置的方法没有效果。
destination
-新的标准错误的目的地
IllegalArgumentException
如果重定向并没有对应的数据,这是一个有效的目标,有
READ
型
public ProcessBuilder redirectInput(File file)
这是一个方便的方法。表格的redirectInput(file)
调用的行为一样,调用redirectInput
(Redirect.from(file))
。
file
-新标准输入源
public ProcessBuilder redirectOutput(File file)
这是一个方便的方法。表格的redirectOutput(file)
调用的行为一样,调用redirectOutput
(Redirect.to(file))
。
file
-新标准输出目的地
public ProcessBuilder redirectError(File file)
这是一个方便的方法。表格的redirectError(file)
调用的行为一样,调用redirectError
(Redirect.to(file))
。
file
-新的标准错误的目的地
public ProcessBuilder.Redirect redirectInput()
start()
方法从源获取标准输入。初始值是
Redirect.PIPE
。
public ProcessBuilder.Redirect redirectOutput()
start()
方法重定向标准输出到目的地。初始值是
Redirect.PIPE
。
public ProcessBuilder.Redirect redirectError()
start()
方法重定向标准错误到目的地。初始值是
Redirect.PIPE
。
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()
。
如果存在安全管理器,它的checkExec
方法调用该对象的command
数组的第一个组件作为它的参数。这可能会导致SecurityException
抛出。
启动一个操作系统的过程是高度依赖于系统的。在许多事情可能出错的是:
在这种情况下,将抛出一个异常。异常的确切性质是依赖于系统,但它将永远是IOException
子类。
这一过程生成器随后的修改不会影响返回的Process
。
Process
对象
NullPointerException
如果命令列表的元素是空的
IndexOutOfBoundsException
-如果命令为空列表(有大小
0
)
SecurityException
-如果存在一个安全管理和
checkExec
方法不允许子进程的创建,或checkRead
方法拒绝读取该文件,或checkWrite
方法拒绝写访问文件IOException
如果I/O错误发生
Runtime.exec(String[], String[], java.io.File)
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.