Класс ProcessBuilder
public final class ProcessBuilder extends Object
Каждый экземпляр ProcessBuilder управляет набором атрибутов процесса. Метод start() создаёт новый экземпляр Process с этими атрибутами. Метод start() можно вызывать несколько раз для создания новых подпроцессов с идентичными или связанными атрибутами.
Метод startPipeline можно вызвать для создания конвейера новых процессов, которые передают вывод каждого процесса непосредственно следующему процессу. Каждый процесс имеет атрибуты соответствующего ProcessBuilder.
Каждый построитель процессов управляет следующими атрибутами процесса:
- команда — список строк, обозначающий файл внешней программы, которую нужно вызвать, и её аргументы, если они есть. Системно-зависимо, какие списки строк представляют собой допустимую команду операционной системы. Например, обычно каждый концептуальный аргумент является элементом этого списка, но в некоторых операционных системах программы должны самостоятельно разбивать строки командной строки на токены — в такой системе реализация Java может требовать, чтобы команды содержали ровно два элемента.
- среда — системно-зависимое сопоставление переменных с значениями. Начальное значение представляет собой копию среды текущего процесса (см.
System.getenv()). - рабочий каталог. Значением по умолчанию является текущий рабочий каталог текущего процесса, обычно каталог, указанный системным свойством
user.dir. -
источник стандартного ввода. По умолчанию подпроцесс считывает ввод из канала. Код Java может получить доступ к этому каналу через выходной поток, возвращаемый методом
Process.getOutputStream(). Однако стандартный ввод можно перенаправить из другого источника с помощью методаredirectInput. В этом случае методProcess.getOutputStream()вернёт нулевой выходной поток, для которого: -
назначение для стандартного вывода и стандартного потока ошибок. По умолчанию подпроцесс записывает стандартный вывод и стандартный поток ошибок в каналы. Код Java может получить доступ к этим каналам через входные потоки, возвращаемые методами
Process.getInputStream()иProcess.getErrorStream(). Однако стандартный вывод и стандартный поток ошибок можно перенаправить в другие места назначения с помощью методовredirectOutputиredirectError. В этом случае метод или методыProcess.getInputStream()и/илиProcess.getErrorStream()вернут нулевой входной поток, для которого: - свойство redirectErrorStream. Изначально этому свойству присвоено значение
false, что означает, что стандартный вывод и стандартный поток ошибок подпроцесса передаются в два отдельных потока, доступных с помощью методовProcess.getInputStream()иProcess.getErrorStream().Если свойству присвоено значение
true, то:- стандартный поток ошибок объединяется со стандартным выводом и всегда направляется в одно и то же место назначения (это упрощает сопоставление сообщений об ошибках с соответствующим выводом)
- общее место назначения стандартного потока ошибок и стандартного вывода можно перенаправить с помощью метода
redirectOutput - любое перенаправление, заданное методом
redirectError, игнорируется при создании подпроцесса - поток, возвращаемый методом
Process.getErrorStream(), всегда будет нулевым входным потоком
Изменение атрибутов построителя процессов влияет на процессы, запускаемые впоследствии методом 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(), а затем добавьте переменные среды.
Если не указано иное, передача аргумента null конструктору или методу этого класса приведёт к выбросу исключения NullPointerException.
- С версии:
- 1.5
Краткое описание вложенных классов
| Модификатор и тип | Класс | Описание |
|---|---|---|
static class |
ProcessBuilder.Redirect |
Представляет источник ввода подпроцесса или место назначения вывода подпроцесса. |
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
ProcessBuilder |
Создаёт построитель процессов с указанной программой операционной системы и аргументами. |
ProcessBuilder |
Создаёт построитель процессов с указанной программой операционной системы и аргументами. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
List |
command() |
Возвращает программу операционной системы и аргументы этого построителя процессов. |
ProcessBuilder |
command |
Задаёт программу операционной системы и аргументы этого построителя процессов. |
ProcessBuilder |
command |
Задаёт программу операционной системы и аргументы этого построителя процессов. |
File |
directory() |
Возвращает рабочий каталог этого построителя процессов. |
ProcessBuilder |
directory |
Задаёт рабочий каталог этого построителя процессов. |
Map |
environment() |
Возвращает представление среды этого построителя процессов в виде карты строк. |
ProcessBuilder |
inheritIO() |
Задаёт источник и место назначения стандартного ввода-вывода подпроцесса такими же, как у текущего процесса Java. |
ProcessBuilder.Redirect |
redirectError() |
Возвращает место назначения стандартного потока ошибок этого построителя процессов. |
ProcessBuilder |
redirectError |
Задаёт файл в качестве места назначения стандартного потока ошибок этого построителя процессов. |
ProcessBuilder |
redirectError |
Задаёт место назначения стандартного потока ошибок этого построителя процессов. |
boolean |
redirectErrorStream() |
Определяет, объединяет ли этот построитель процессов стандартный поток ошибок со стандартным выводом. |
ProcessBuilder |
redirectErrorStream |
Задаёт свойство redirectErrorStream этого построителя процессов. |
ProcessBuilder.Redirect |
redirectInput() |
Возвращает источник стандартного ввода этого построителя процессов. |
ProcessBuilder |
redirectInput |
Задаёт файл в качестве источника стандартного ввода этого построителя процессов. |
ProcessBuilder |
redirectInput |
Задаёт источник стандартного ввода этого построителя процессов. |
ProcessBuilder.Redirect |
redirectOutput() |
Возвращает место назначения стандартного вывода этого построителя процессов. |
ProcessBuilder |
redirectOutput |
Задаёт файл в качестве места назначения стандартного вывода этого построителя процессов. |
ProcessBuilder |
redirectOutput |
Задаёт место назначения стандартного вывода этого построителя процессов. |
Process |
start() |
Запускает новый процесс с использованием атрибутов этого построителя процессов. |
static List |
startPipeline |
Запускает процесс для каждого ProcessBuilder, создавая конвейер процессов, связанных потоками стандартного вывода и стандартного ввода. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создаёт и возвращает копию этого объекта. |
boolean |
equals |
Указывает, равен ли этот объект какому-либо другому объекту. |
protected void |
finalize() |
Устарело, будет удалено: этот элемент API подлежит удалению в будущей версии. Финализация устарела и подлежит удалению в одном из будущих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения этого Object. |
int |
hashCode() |
Возвращает значение хеш-кода этого объекта. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
String |
toString() |
Возвращает строковое представление объекта. |
final void |
wait() |
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt, либо до истечения определённого промежутка реального времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt, либо до истечения определённого промежутка реального времени. |
Подробное описание конструкторов
ProcessBuilder
public ProcessBuilder(List<String> command)
command. Последующие изменения списка будут отражены в состоянии построителя процессов. Проверка того, соответствует ли command допустимой команде операционной системы, не выполняется.- Параметры:
-
command— список, содержащий программу и ее аргументы
ProcessBuilder
public ProcessBuilder(String... command)
command, в том же порядке. Проверка того, соответствует ли command допустимой команде операционной системы, не выполняется.- Параметры:
-
command— массив строк, содержащий программу и ее аргументы
Подробное описание методов
command
public ProcessBuilder command(List<String> command)
command. Последующие изменения списка будут отражены в состоянии построителя процессов. Проверка того, соответствует ли command допустимой команде операционной системы, не выполняется.- Параметры:
-
command— список, содержащий программу и ее аргументы - Возвращает:
- этот построитель процессов
command
public ProcessBuilder command(String... command)
command, в том же порядке. Проверка того, соответствует ли command допустимой команде операционной системы, не выполняется.- Параметры:
-
command— массив строк, содержащий программу и ее аргументы - Возвращает:
- этот построитель процессов
command
public List<String> command()
- Возвращает:
- программу и аргументы этого построителя процессов
environment
public Map<String,String> environment()
System.getenv()). Впоследствии дочерние процессы, запущенные методом start() этого объекта, будут использовать эту карту в качестве своей среды. Возвращенный объект можно изменять с помощью обычных операций Map. Эти изменения будут видны дочерним процессам, запущенным методом start(). Экземпляры ProcessBuilder всегда содержат независимые среды процессов, поэтому изменения возвращенной карты никогда не будут отражены ни в каком другом экземпляре ProcessBuilder или в значениях, возвращаемых методом System.getenv.
Если система не поддерживает переменные среды, возвращается пустая карта.
Возвращенная карта не допускает ключи или значения, равные null. Попытка вставить ключ или значение null либо проверить их наличие приведет к выбросу исключения NullPointerException. Попытка проверить наличие ключа или значения, тип которого не является String, приведет к выбросу исключения ClassCastException.
Поведение возвращенной карты зависит от системы. Система может не разрешать изменять переменные среды или может запрещать определенные имена переменных или значения. Поэтому попытки изменить карту могут завершиться исключениями UnsupportedOperationException или IllegalArgumentException, если операционная система не допускает такое изменение.
Поскольку внешний формат имен и значений переменных среды зависит от системы, между ними и строками Unicode в Java может не быть взаимно однозначного соответствия. Тем не менее карта реализована так, что переменные среды, не измененные кодом Java, будут иметь в дочернем процессе неизмененное нативное представление.
Возвращенная карта и ее представления коллекций могут не соответствовать общему контракту методов Object.equals(Object) и Object.hashCode().
На большинстве платформ возвращенная карта, как правило, чувствительна к регистру.
При передаче информации дочернему процессу Java обычно предпочтительнее использовать системные свойства, а не переменные среды.
- Возвращает:
- среду этого построителя процессов
- См. также:
directory
public File directory()
start() этого объекта, будут использовать его в качестве рабочего каталога. Возвращенное значение может быть null — это означает, что в качестве рабочего каталога дочернего процесса следует использовать рабочий каталог текущего процесса Java, обычно каталог, указанный системным свойством user.dir.- Возвращает:
- рабочий каталог этого построителя процессов
directory
public ProcessBuilder directory(File directory)
start() этого объекта, будут использовать его в качестве рабочего каталога. Аргумент может быть null — это означает, что в качестве рабочего каталога дочернего процесса следует использовать рабочий каталог текущего процесса Java, обычно каталог, указанный системным свойством user.dir.- Параметры:
-
directory— новый рабочий каталог - Возвращает:
- этот построитель процессов
redirectInput
public ProcessBuilder redirectInput(ProcessBuilder.Redirect source)
start() этого объекта, будут получать стандартный ввод из этого источника. Если источником является Redirect.PIPE (начальное значение), то в стандартный ввод дочернего процесса можно записывать через выходной поток, возвращаемый методом Process.getOutputStream(). Если источнику задано любое другое значение, метод Process.getOutputStream() вернет выходной поток null.
- Параметры:
-
source— новый источник стандартного ввода - Возвращает:
- этот построитель процессов
- Выбрасывает:
-
IllegalArgumentException— если перенаправление не соответствует допустимому источнику данных, то есть имеет типWRITEилиAPPEND - С версии:
- 1.7
redirectOutput
public ProcessBuilder redirectOutput(ProcessBuilder.Redirect destination)
start() этого объекта, будут отправлять стандартный вывод в это назначение. Если назначением является Redirect.PIPE (начальное значение), то стандартный вывод дочернего процесса можно считывать через входной поток, возвращаемый методом Process.getInputStream(). Если назначению задано любое другое значение, метод Process.getInputStream() вернет входной поток null.
- Параметры:
-
destination— новое назначение стандартного вывода - Возвращает:
- этот построитель процессов
- Выбрасывает:
-
IllegalArgumentException— если перенаправление не соответствует допустимому назначению данных, то есть имеет типREAD - С версии:
- 1.7
redirectError
public ProcessBuilder redirectError(ProcessBuilder.Redirect destination)
start() этого объекта, будут отправлять стандартный поток ошибок в это назначение. Если назначением является Redirect.PIPE (начальное значение), то вывод ошибок дочернего процесса можно считывать через входной поток, возвращаемый методом Process.getErrorStream(). Если назначению задано любое другое значение, метод Process.getErrorStream() вернет входной поток null.
Если свойству redirectErrorStream задано значение true, перенаправление, заданное этим методом, не действует.
- Параметры:
-
destination— новое назначение стандартного потока ошибок - Возвращает:
- этот построитель процессов
- Выбрасывает:
-
IllegalArgumentException— если перенаправление не соответствует допустимому назначению данных, то есть имеет типREAD - С версии:
- 1.7
redirectInput
public ProcessBuilder redirectInput(File file)
Это удобный метод. Вызов вида redirectInput(file) действует точно так же, как вызов redirectInput (Redirect.from(file)).
- Параметры:
-
file— новый источник стандартного ввода - Возвращает:
- этот построитель процессов
- С версии:
- 1.7
redirectOutput
public ProcessBuilder redirectOutput(File file)
Это удобный метод. Вызов вида redirectOutput(file) действует точно так же, как вызов redirectOutput (Redirect.to(file)).
- Параметры:
-
file— новое назначение стандартного вывода - Возвращает:
- этот построитель процессов
- С версии:
- 1.7
redirectError
public ProcessBuilder redirectError(File file)
Это удобный метод. Вызов вида redirectError(file) действует точно так же, как вызов redirectError (Redirect.to(file)).
- Параметры:
-
file— новое назначение стандартного потока ошибок - Возвращает:
- этот построитель процессов
- С версии:
- 1.7
redirectInput
public ProcessBuilder.Redirect redirectInput()
start() этого объекта, будут получать стандартный ввод из этого источника. Начальное значение — Redirect.PIPE.- Возвращает:
- источник стандартного ввода для этого построителя процессов
- С версии:
- 1.7
redirectOutput
public ProcessBuilder.Redirect redirectOutput()
start() этого объекта, будут перенаправлять стандартный вывод в это назначение. Начальное значение — Redirect.PIPE.- Возвращает:
- назначение стандартного вывода для этого построителя процессов
- С версии:
- 1.7
redirectError
public ProcessBuilder.Redirect redirectError()
start() этого объекта, будут перенаправлять стандартный поток ошибок в это назначение. Начальное значение — Redirect.PIPE.- Возвращает:
- назначение стандартного потока ошибок для этого построителя процессов
- С версии:
- 1.7
inheritIO
public ProcessBuilder inheritIO()
Это удобный метод. Вызов вида
pb.inheritIO()
pb.redirectInput(Redirect.INHERIT)
.redirectOutput(Redirect.INHERIT)
.redirectError(Redirect.INHERIT)
system().- Примечание по реализации:
- Если процесс
started, а {#code System.out} и/или {#code System.err} закрыты в текущем процессе, соответствующий вывод дочернего процесса будет отброшен. - Возвращает:
- этот построитель процессов
- С версии:
- 1.7
redirectErrorStream
public boolean redirectErrorStream()
Если этому свойству задано значение true, то любой вывод ошибок, созданный впоследствии дочерними процессами, запущенными методом start() этого объекта, будет объединен со стандартным выводом, и оба потока можно будет считывать методом Process.getInputStream(). Это упрощает сопоставление сообщений об ошибках с соответствующим выводом. Начальное значение — false.
- Возвращает:
- значение свойства
redirectErrorStreamэтого построителя процессов
redirectErrorStream
public ProcessBuilder redirectErrorStream(boolean redirectErrorStream)
redirectErrorStream этого построителя процессов. Если этому свойству задано значение true, то любой вывод ошибок, созданный впоследствии дочерними процессами, запущенными методом start() этого объекта, будет объединен со стандартным выводом, и оба потока можно будет считывать методом Process.getInputStream(). Это упрощает сопоставление сообщений об ошибках с соответствующим выводом. Начальное значение — false.
- Параметры:
-
redirectErrorStream— новое значение свойства - Возвращает:
- этот построитель процессов
start
public Process start() throws IOException
Новый процесс выполнит команду и аргументы, заданные методом command(), в рабочем каталоге, заданном методом directory(), и со средой процесса, заданной методом environment().
Этот метод проверяет, является ли команда допустимой командой операционной системы. Набор допустимых команд зависит от системы, но как минимум команда должна быть непустым списком строк, не содержащих null.
В некоторых операционных системах для запуска процесса может требоваться минимальный набор зависящих от системы переменных среды. В результате дочерний процесс может унаследовать дополнительные параметры переменных среды помимо указанных в environment() построителя процессов. Минимальный набор зависящих от системы переменных среды может переопределять значения, заданные в среде.
Запуск процесса операционной системы в значительной степени зависит от системы. Среди множества возможных проблем:
- Не найден файл программы операционной системы.
- Доступ к файлу программы запрещен.
- Рабочий каталог не существует.
- В аргументе команды содержится недопустимый символ, например NUL.
В таких случаях будет выброшено исключение. Точный тип исключения зависит от системы, но оно всегда будет подклассом IOException.
Если операционная система не поддерживает создание процессов, будет выброшено исключение UnsupportedOperationException.
Последующие изменения этого построителя процессов не повлияют на возвращенный объект Process.
- Примечание по реализации:
- В эталонной реализации можно включить ведение журнала команды, аргументов, каталога, трассировки стека и идентификатора процесса. Записываемая в журнал информация может содержать конфиденциальные сведения, поэтому следует тщательно оценить риск их раскрытия. Ведение журнала включается, когда уровень журналирования системного регистратора с именем
java.lang.ProcessBuilderравенLevel.DEBUGилиLevel.TRACE. При включении дляLevel.DEBUGв журнал записываются только идентификатор процесса, каталог, команда и трассировка стека. При включении дляLevel.TRACEвместе с идентификатором процесса, каталогом, командой и трассировкой стека записываются аргументы. - Возвращает:
- новый объект
Processдля управления дочерним процессом - Выбрасывает:
-
NullPointerException— если элемент списка команд равен null -
IndexOutOfBoundsException— если список команд пуст (его размер равен0) -
UnsupportedOperationException— если операционная система не поддерживает создание процессов. -
IOException— если произошла ошибка ввода-вывода - См. также:
startPipeline
public static List<Process> startPipeline(List<ProcessBuilder> builders) throws IOException
ProcessBuilder должны иметь значение Redirect.PIPE. Потоки ввода и вывода между промежуточными процессами недоступны. Метод standard input всех процессов, кроме первого, возвращает выходные потоки null. Метод standard output всех процессов, кроме последнего, возвращает входные потоки null.
Свойство redirectErrorStream() каждого объекта ProcessBuilder применяется к соответствующему процессу. Если ему задано значение true, поток ошибок записывается в тот же поток, что и стандартный вывод.
Если при запуске любого из процессов возникает исключение, все процессы принудительно завершаются.
Метод startPipeline выполняет для каждого объекта ProcessBuilder те же проверки, что и метод start(). Каждый новый процесс выполняет команду и аргументы, заданные методом command() соответствующего построителя процессов, в рабочем каталоге, заданном его методом directory(), и со средой процесса, заданной его методом environment().
Команда каждого построителя процессов проверяется на допустимость для операционной системы. Набор допустимых команд зависит от системы, но как минимум команда должна быть непустым списком строк, не содержащих null.
В некоторых операционных системах для запуска процесса может требоваться минимальный набор зависящих от системы переменных среды. В результате дочерний процесс может унаследовать дополнительные параметры переменных среды помимо указанных в environment() построителя процессов. Минимальный набор зависящих от системы переменных среды может переопределять значения, заданные в среде.
Запуск процесса операционной системы в значительной степени зависит от системы. Среди множества возможных проблем:
- Не найден файл программы операционной системы.
- Доступ к файлу программы запрещен.
- Рабочий каталог не существует.
- В аргументе команды содержится недопустимый символ, например NUL.
В таких случаях будет выброшено исключение. Точный тип исключения зависит от системы, но оно всегда будет подклассом IOException.
Если операционная система не поддерживает создание процессов, будет выброшено исключение UnsupportedOperationException.
Последующие изменения любых указанных построителей не повлияют на возвращенный объект Process.
- Примечание к API:
- Например, чтобы подсчитать уникальные импорты для всех файлов в иерархии каталогов на платформе, совместимой с Unix:
String directory = "/home/duke/src"; ProcessBuilder[] builders = { new ProcessBuilder("find", directory, "-type", "f"), new ProcessBuilder("xargs", "grep", "-h", "^import "), new ProcessBuilder("awk", "{print $2;}"), new ProcessBuilder("sort", "-u")}; List<Process> processes = ProcessBuilder.startPipeline( Arrays.asList(builders)); Process last = processes.get(processes.size() - 1); try (InputStream is = last.getInputStream(); Reader isr = new InputStreamReader(is); BufferedReader r = new BufferedReader(isr)) { long count = r.lines().count(); } - Примечание по реализации:
- В эталонной реализации можно включить ведение журнала для каждого созданного процесса. Подробности см. в описании метода
start(). - Параметры:
-
builders— список объектов ProcessBuilder - Возвращает:
List<Process>ы, запущенные соответствующими объектами ProcessBuilder- Выбрасывает:
-
IllegalArgumentException— если любое из перенаправлений, кроме стандартного ввода первого построителя и стандартного вывода последнего построителя, не имеет значенияProcessBuilder.Redirect.PIPE. -
NullPointerException— если элемент списка команд равен null, элемент списка ProcessBuilder равен null или аргумент builders равен null -
IndexOutOfBoundsException— если список команд пуст (его размер равен0) -
UnsupportedOperationException— если операционная система не поддерживает создание процессов -
IOException— если произошла ошибка ввода-вывода - С версии:
- 9
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.