Класс ProcessBuilder
public final class ProcessBuilder extends Object
Каждый ProcessBuilder экземпляр управляет набором атрибутов процесса. Метод start() создаёт новый экземпляр Process с этими атрибутами. Метод start() может вызываться повторно с одного экземпляра для создания новых дочерних процессов с идентичными или связанными атрибутами.
Метод startPipeline может вызываться для создания цепочки новых процессов, которые передают вывод каждого процесса напрямую следующему процессу. Каждый процесс имеет атрибуты соответствующего ProcessBuilder.
Каждый объект 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(), всегда будет нулевым входным потоком
Изменение атрибутов ProcessBuilder повлияет на процессы, которые впоследствии будут запущены с помощью метода 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.
- Since:
- 1.5
Краткое описание вложенных классов
| Модификатор и тип | Класс | Описание |
|---|---|---|
static class |
ProcessBuilder.Redirect |
Представляет источник входных данных подпроцесса или место назначения выходных данных подпроцесса. |
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
ProcessBuilder |
Создаёт объект ProcessBuilder с указанной программой операционной системы и аргументами. |
ProcessBuilder |
Создаёт объект ProcessBuilder с указанной программой операционной системы и аргументами. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
List<String> |
command() |
Возвращает программу операционной системы и аргументы этого объекта ProcessBuilder. |
ProcessBuilder |
command |
Устанавливает программу операционной системы и аргументы этого объекта ProcessBuilder. |
ProcessBuilder |
command |
Устанавливает программу операционной системы и аргументы этого объекта ProcessBuilder. |
File |
directory() |
Возвращает рабочую директорию этого объекта ProcessBuilder. |
ProcessBuilder |
directory |
Устанавливает рабочую директорию этого объекта ProcessBuilder. |
Map<String, |
environment() |
Возвращает представление среды этого объекта ProcessBuilder в виде карты строк. |
ProcessBuilder |
inheritIO() |
Устанавливает источник и место назначения стандартного ввода/вывода подпроцесса таким же, как у текущего процесса Java. |
ProcessBuilder.Redirect |
redirectError() |
Возвращает место назначения стандартной ошибки этого объекта ProcessBuilder. |
ProcessBuilder |
redirectError |
Устанавливает место назначения стандартной ошибки этого объекта ProcessBuilder на файл. |
ProcessBuilder |
redirectError |
Устанавливает место назначения стандартной ошибки этого объекта ProcessBuilder. |
boolean |
redirectErrorStream() |
Определяет, сливаются ли стандартная ошибка и стандартный вывод этого объекта ProcessBuilder. |
ProcessBuilder |
redirectErrorStream |
Устанавливает свойство redirectErrorStream этого объекта ProcessBuilder. |
ProcessBuilder.Redirect |
redirectInput() |
Возвращает источник стандартного ввода этого объекта ProcessBuilder. |
ProcessBuilder |
redirectInput |
Устанавливает источник стандартного ввода этого объекта ProcessBuilder на файл. |
ProcessBuilder |
redirectInput |
Устанавливает источник стандартного ввода этого объекта ProcessBuilder. |
ProcessBuilder.Redirect |
redirectOutput() |
Возвращает место назначения стандартного вывода этого объекта ProcessBuilder. |
ProcessBuilder |
redirectOutput |
Устанавливает место назначения стандартного вывода этого объекта ProcessBuilder на файл. |
ProcessBuilder |
redirectOutput |
Устанавливает место назначения стандартного вывода этого объекта ProcessBuilder. |
Process |
start() |
Запускает новый процесс с помощью атрибутов этого объекта ProcessBuilder. |
static List<Process> |
startPipeline |
Запускает процесс для каждого объекта ProcessBuilder, создавая цепочку процессов, связанных стандартным выводом и стандартным вводом. |
Подробное описание конструкторов
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-значений. Попытка вставки или запроса наличия null-ключа или null-значения приведёт к исключению NullPointerException. Попытка запроса наличия ключа или значения, которые не являются строкой String, приведёт к исключению ClassCastException.
Поведение возвращаемой карты зависит от системы. Система может не допускать модификаций переменных среды или запрещать определённые имена или значения переменных. По этой причине попытки модификации карты могут завершиться исключением UnsupportedOperationException или IllegalArgumentException, если модификация не разрешена операционной системой.
Поскольку внешний формат имён и значений переменных среды зависит от системы, между ними и строками Юникода Java может не быть взаимно однозначного соответствия. Тем не менее, карта реализована таким образом, что переменные среды, которые не модифицируются кодом Java, будут иметь неизменное внутреннее представление в подпроцессе.
Возвращаемая карта и её коллекции представлений могут не соответствовать общему соглашению методов Object.equals(java.lang.Object) и Object.hashCode().
Возвращаемая карта, как правило, регистрозависимая на всех платформах.
Если существует менеджер безопасности, его метод checkPermission вызывается с разрешением RuntimePermission("getenv.*"). Это может привести к выбросу исключения SecurityException.
При передаче информации в подпроцесс Java, свойства системы обычно предпочтительнее переменных среды.
- Возвращает:
- среда этого конструктора процесса
- Выбрасывает:
-
SecurityException- если существует менеджер безопасности, и его методcheckPermissionне позволяет получить доступ к среде процесса - См. также:
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() вернёт нулевой поток ввода.
Если атрибут redirectErrorStream был установлен true, то перенаправление, заданное этим методом, не имеет эффекта.
- Parameters:
-
destination- новое место назначения стандартного потока ошибок - Returns:
- этот обработчик процесса
- Throws:
-
IllegalArgumentException- если перенаправление не соответствует допустимому месту назначения данных, то есть имеет типREAD - Since:
- 1.7
redirectInput
public ProcessBuilder redirectInput(File file)
Это метод удобства. Вызов вида redirectInput(file) ведет себя точно так же, как вызов redirectInput (Redirect.from(file)).
- Parameters:
-
file- новый источник стандартного потока ввода - Returns:
- этот обработчик процесса
- Since:
- 1.7
redirectOutput
public ProcessBuilder redirectOutput(File file)
Это метод удобства. Вызов вида redirectOutput(file) ведет себя точно так же, как вызов redirectOutput (Redirect.to(file)).
- Parameters:
-
file- новое место назначения стандартного потока вывода - Returns:
- этот обработчик процесса
- Since:
- 1.7
redirectError
public ProcessBuilder redirectError(File file)
Это метод удобства. Вызов вида redirectError(file) ведет себя точно так же, как вызов redirectError (Redirect.to(file)).
- Parameters:
-
file- новое место назначения стандартного потока ошибок - Returns:
- этот обработчик процесса
- Since:
- 1.7
redirectInput
public ProcessBuilder.Redirect redirectInput()
start(), получают стандартный поток ввода из этого источника. Начальное значение — Redirect.PIPE.- Returns:
- источник стандартного потока ввода обработчика процесса
- Since:
- 1.7
redirectOutput
public ProcessBuilder.Redirect redirectOutput()
start(), перенаправляют свой стандартный поток вывода в это место назначения. Начальное значение — Redirect.PIPE.- Returns:
- место назначения стандартного потока вывода обработчика процесса
- Since:
- 1.7
redirectError
public ProcessBuilder.Redirect redirectError()
start(), перенаправляют свой стандартный поток ошибок в это место назначения. Начальное значение — Redirect.PIPE.- Returns:
- место назначения стандартного потока ошибок обработчика процесса
- Since:
- 1.7
inheritIO
public ProcessBuilder inheritIO()
Это метод удобства. Вызов вида
pb.inheritIO()
ведет себя точно так же, как вызов
pb.redirectInput(Redirect.INHERIT)
.redirectOutput(Redirect.INHERIT)
.redirectError(Redirect.INHERIT)
Это обеспечивает поведение, эквивалентное большинству интерпретаторов команд операционных систем или стандартной функции C-библиотеки system().- Returns:
- этот обработчик процесса
- Since:
- 1.7
redirectErrorStream
public boolean redirectErrorStream()
Если этот параметр true, то все выходные данные об ошибках, сгенерированные подпроцессами, запущенными впоследствии этим объектом с помощью метода start(), будут объединены со стандартным потоком вывода, так что оба можно будет прочитать с помощью метода Process.getInputStream(). Это облегчает сопоставление сообщений об ошибках с соответствующими выходными данными. Начальное значение — false.
- Returns:
- свойство обработчика процесса
redirectErrorStream
redirectErrorStream
public ProcessBuilder redirectErrorStream(boolean redirectErrorStream)
redirectErrorStream этого обработчика процесса. Если этот параметр true, то все выходные данные об ошибках, сгенерированные подпроцессами, запущенными впоследствии этим объектом с помощью метода start(), будут объединены со стандартным потоком вывода, так что оба можно будет прочитать с помощью метода Process.getInputStream(). Это облегчает сопоставление сообщений об ошибках с соответствующими выходными данными. Начальное значение — false.
- Parameters:
-
redirectErrorStream- новое значение свойства - Returns:
- этот обработчик процесса
start
public Process start() throws IOException
Новый процесс вызовет команду и аргументы, заданные методом command(), в рабочей директории, заданной методом directory(), со средой процесса, заданной методом environment().
Этот метод проверяет, является ли команда допустимой командой операционной системы. Какие команды допустимы, зависит от системы, но по меньшей мере команда должна быть непустым списком непустых строк.
Для запуска процесса на некоторых операционных системах может потребоваться минимальный набор зависимых от системы переменных среды. В результате подпроцесс может унаследовать дополнительные настройки переменных среды, кроме тех, которые указаны в обработчике процесса в методе environment().
Если существует менеджер безопасности, вызывается его метод checkExec с первым компонентом массива command этого объекта в качестве аргумента. Это может привести к исключению SecurityException.
Запуск процесса операционной системы сильно зависит от системы. Среди многих возможных проблем:
- Файл программы операционной системы не найден.
- Доступ к файлу программы запрещен.
- Рабочая директория не существует.
- Недопустимый символ в аргументе команды, например, NUL.
В таких случаях будет выброшено исключение. Точный характер исключения зависит от системы, но это всегда будет подкласс IOException.
Если операционная система не поддерживает создание процессов, будет выброшено исключение UnsupportedOperationException.
Последующие изменения в этом обработчике процесса не повлияют на возвращаемый объект Process.
- Returns:
- новый объект
Processдля управления подпроцессом - Throws:
-
NullPointerException- если элемент списка команд равен null -
IndexOutOfBoundsException- если команда является пустым списком (имеет размер0) -
SecurityException- если менеджер безопасности существует и- его метод
checkExecне разрешает создание подпроцесса, или - стандартный поток ввода подпроцесса был перенаправлен из файла с помощью метода redirectInput и метод менеджера безопасности
checkReadзапрещает чтение файла, или - стандартный поток вывода или стандартный поток ошибок подпроцесса был перенаправлен в файл с помощью метода redirectOutput и метод менеджера безопасности
checkWriteзапрещает запись в файл
- его метод
-
UnsupportedOperationException- Если операционная система не поддерживает создание процессов. -
IOException- если произошла ошибка ввода/вывода - See Also:
startPipeline
public static List<Process> startPipeline(List<ProcessBuilder> builders) throws IOException
ProcessBuilder перенаправления должны быть Redirect.PIPE.
Все потоки ввода и вывода между промежуточными процессами недоступны. Поток standard input всех процессов, кроме первого, является нулевым потоком вывода. Поток standard output всех процессов, кроме последнего, является нулевым потоком ввода.
Перенаправление стандартной ошибки redirectErrorStream() каждого ProcessBuilder применяется к соответствующему процессу. Если оно установлено в true, поток ошибки записывается в тот же поток, что и стандартный вывод.
Если запуск любого из процессов вызывает исключение, все процессы насильственно уничтожаются.
Метод startPipeline выполняет те же проверки для каждого ProcessBuilder, что и метод start(). Каждый новый процесс вызывает команду и аргументы, заданные command() соответствующего билдера процесса, в рабочей директории, заданной его directory(), с окружением процесса, заданным его environment().
Команда каждого билдера процесса проверяется на корректность как команды операционной системы. Какие команды допустимы, зависит от системы, но как минимум команда должна быть непустым списком непустых строк.
Для запуска процесса на некоторых операционных системах может потребоваться минимальный набор зависящих от системы переменных окружения. В результате подпроцесс может унаследовать дополнительные настройки переменных окружения помимо тех, которые указаны в environment() билдера процесса.
Если существует менеджер безопасности, его метод checkExec вызывается с первым компонентом массива command каждого билдера процесса в качестве аргумента. Это может привести к тому, что будет брошено исключение SecurityException.
Запуск процесса операционной системы сильно зависит от системы. Среди многих возможных проблем:
- Файл программы операционной системы не найден.
- Доступ к файлу программы запрещен.
- Рабочая директория не существует.
- Недопустимый символ в аргументе команды, например NUL.
В таких случаях будет брошено исключение. Точный характер исключения зависит от системы, но оно всегда будет подклассом IOException.
Если операционная система не поддерживает создание процессов, будет брошено исключение UnsupportedOperationException.
Последующие изменения в любом из указанных билдеров не повлияют на возвращаемый объект Process.
- API Note:
- Например, для подсчета уникальных импортов для всех файлов в иерархии файлов на платформе, совместимой с 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(); } - Parameters:
-
builders- список ProcessBuilders - Returns:
- массив процессов, запущенных из соответствующих ProcessBuilder
- Throws:
-
IllegalArgumentException- если какое-либо из перенаправлений, кроме стандартного ввода первого билдера и стандартного вывода последнего билдера, не являетсяProcessBuilder.Redirect.PIPE. -
NullPointerException- если элемент списка команд равен null, или элемент списка ProcessBuilder равен null, или аргумент билдеров равен null -
IndexOutOfBoundsException- если команда является пустым списком (имеет размер0) -
SecurityException- если менеджер безопасности существует и- его метод
checkExecне разрешает создание подпроцесса, или - стандартный ввод подпроцесса был перенаправлен из файла и метод менеджера безопасности
checkReadзапрещает чтение из файла, или - стандартный вывод или стандартная ошибка подпроцесса были перенаправлены в файл и метод менеджера безопасности
checkWriteзапрещает запись в файл
- его метод
-
UnsupportedOperationException- если операционная система не поддерживает создание процессов -
IOException- если произошла ошибка ввода-вывода - Since:
- 9
© 1993, 2021, 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.
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/ProcessBuilder.html