This class is used to create operating system processes.
Each ProcessBuilder
instance manages a collection
of process attributes. The start()
method creates a new
Process
instance with those attributes. The start()
method can be invoked repeatedly from the same instance
to create new subprocesses with identical or related attributes.
Each process builder manages these process attributes:
System.getenv()
).
user.dir
.
Process.getOutputStream()
. However, standard input may
be redirected to another source using
redirectInput
.
In this case, Process.getOutputStream()
will return a
null output stream, for which:
write
methods always
throw IOException
close
method does nothing
Process.getInputStream()
and
Process.getErrorStream()
. However, standard output and
standard error may be redirected to other destinations using
redirectOutput
and
redirectError
.
In this case, Process.getInputStream()
and/or
Process.getErrorStream()
will return a null input
stream, for which:
read
methods always return
-1
available
method always returns
0
close
method does nothing
false
, meaning that the standard output and error
output of a subprocess are sent to two separate streams, which can
be accessed using the Process.getInputStream()
and Process.getErrorStream()
methods.
If the value is set to true
, then:
redirectOutput
redirectError
method is ignored when creating a subprocess
Process.getErrorStream()
will
always be a null input stream
Modifying a process builder's attributes will affect processes
subsequently started by that object's start()
method, but
will never affect previously started processes or the Java process
itself.
Most error checking is performed by the start()
method.
It is possible to modify the state of an object so that start()
will fail. For example, setting the command attribute to
an empty list will not throw an exception unless start()
is invoked.
Note that this class is not synchronized.
If multiple threads access a ProcessBuilder
instance
concurrently, and at least one of the threads modifies one of the
attributes structurally, it must be synchronized externally.
Starting a new process which uses the default working directory and environment is easy:
Process p = new ProcessBuilder("myCommand", "myArg").start();
Here is an example that starts a process with a modified working directory and environment, and redirects standard output and error to be appended to a log file:
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;
To start a process with an explicit set of environment
variables, first call Map.clear()
before adding environment variables.