Класс 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.
- Since:
- 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 |
Запускает Process для каждого 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.
Если система не поддерживает переменные среды, возвращается пустая карта.
Возвращаемая карта не допускает нулевых ключей или значений. Попытка вставки или запроса наличия нулевого ключа или значения приведёт к исключению 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() вернёт нулевой поток вывода.
- Параметры:
-
source- новый источник стандартного ввода - Возвращает:
- этот обработчик процесса
- Исключения:
-
IllegalArgumentException- если перенаправление не соответствует допустимому источнику данных, то есть имеет типWRITEилиAPPEND - С:
- 1.7
redirectOutput
public ProcessBuilder redirectOutput(ProcessBuilder.Redirect destination)
start(), отправляют свой стандартный вывод в это место назначения. Если место назначения — Redirect.PIPE (начальное значение), то стандартный вывод подпроцесса можно прочитать с помощью потока ввода, возвращаемого Process.getInputStream(). Если место назначения установлено на другое значение, то Process.getInputStream() вернёт нулевой поток ввода.
- Параметры:
-
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.
- Implementation Note:
- В реализации по умолчанию можно включить ведение журнала команды, аргументов, каталога, стека вызовов и идентификатора процесса. Записанная информация может содержать конфиденциальную информацию о безопасности, и потенциальное раскрытие этой информации следует тщательно рассмотреть. Ведение журнала включено, когда уровень ведения журнала для системного логгера под именем
java.lang.ProcessBuilderравенLevel.DEBUGилиLevel.TRACE. При включении дляLevel.DEBUGрегистрируется только идентификатор процесса, каталог, команда и стек вызовов. При включении дляLevel.TRACEаргументы включаются вместе с идентификатором процесса, каталогом, командой и стеком вызовов. - Returns:
- новый объект
Processдля управления подпроцессом - Throws:
-
NullPointerException- если элемент списка команд равен null -
IndexOutOfBoundsException- если команда является пустым списком (имеет размер0) -
SecurityException- если менеджер безопасности существует и- его метод
checkExecне разрешает создание подпроцесса, или - стандартный поток ввода для подпроцесса был перенаправлен из файла и метод менеджера безопасности
checkReadзапрещает чтение из файла, или - стандартный поток вывода или стандартный поток ошибок подпроцесса был перенаправлен в файл и метод менеджера безопасности
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 вызывается с первым компонентом каждого массива билдера процесса в качестве аргумента. Это может привести к тому, что будет брошено исключение 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(); } - Implementation Note:
- В реализации по умолчанию, регистрация каждого созданного процесса может быть включена, см.
start()для получения подробной информации. - Parameters:
-
builders- список ProcessBuilder - Returns:
- список
List<Process>процессов, запущенных из соответствующего ProcessBuilder - Throws:
-
IllegalArgumentException- если любое из перенаправлений, кроме стандартного ввода первого билдера и стандартного вывода последнего билдера, не являетсяProcessBuilder.Redirect.PIPE. -
NullPointerException- если элемент списка команд равен null, или элемент списка ProcessBuilder равен null, или список билдеров равен null -
IndexOutOfBoundsException- если команда является пустым списком (имеет размер0) -
SecurityException- если менеджер безопасности существует и- его метод
checkExecне позволяет создать подпроцесс, или - стандартный вход в подпроцесс был перенаправлен из файла и метод менеджера безопасности
checkReadзапрещает чтение из файла, или - стандартный вывод или стандартная ошибка подпроцесса были перенаправлены в файл и метод менеджера безопасности
checkWriteзапрещает запись в файл
- его метод
-
UnsupportedOperationException- Если операционная система не поддерживает создание процессов -
IOException- если возникает ошибка ввода-вывода - Since:
- 9
© 1993, 2023, 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/21/docs/api/java.base/java/lang/ProcessBuilder.html