Spec-Zone.ru › OpenJDK 8

Класс ProcessBuilder

  • java.lang.Object
    • java.lang.ProcessBuilder

public final class ProcessBuilder
extends Object

Этот класс используется для создания процессов операционной системы.

Каждый ProcessBuilder экземпляр управляет набором атрибутов процесса. Метод start() создаёт новый Process экземпляр с этими атрибутами. Метод start() можно вызывать повторно для создания новых дочерних процессов с идентичными или связанными атрибутами.

Каждый создатель процесса управляет этими атрибутами процесса:

  • команда, список строк, определяющий файл внешней программы для вызова и её аргументы, если таковые имеются. Список строк, представляющих допустимую команду операционной системы, зависит от системы. Например, часто каждый концептуальный аргумент является элементом этого списка, но существуют операционные системы, где программы ожидают токенизацию строк командной строки — в такой системе Java-реализация может потребовать, чтобы команды содержали ровно два элемента.
  • среда, это зависящее от системы отображение переменных на значения. Начальное значение — копия среды текущего процесса (см. System.getenv()).
  • рабочий каталог. Значение по умолчанию — текущий рабочий каталог текущего процесса, обычно каталог, указанный системной переменной user.dir.
  • источник стандартного ввода. По умолчанию дочерний процесс считывает ввод с канала. Java-код может получить доступ к этому каналу через поток вывода, возвращаемый методом Process.getOutputStream(). Однако стандартный ввод может быть перенаправлен на другой источник с помощью redirectInput. В этом случае Process.getOutputStream() вернёт нулевой поток вывода, для которого:
    • методы write всегда выбрасывают IOException
    • метод close ничего не делает
  • назначение для стандартного вывода и стандартной ошибки. По умолчанию дочерний процесс записывает стандартный вывод и стандартную ошибку в каналы. Java-код может получить доступ к этим каналам через потоки ввода, возвращаемые методами Process.getInputStream() и Process.getErrorStream(). Однако стандартный вывод и стандартная ошибка могут быть перенаправлены на другие назначения с помощью redirectOutput и redirectError. В этом случае Process.getInputStream() и/или Process.getErrorStream() вернут нулевой поток ввода, для которого:
    • методы read всегда возвращают -1
    • метод available всегда возвращает 0
    • метод close ничего не делает
  • свойство 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() перед добавлением переменных среды.

С тех пор:
1.5

Вложенные классы

Модификатор и тип Класс и описание
static class  ProcessBuilder.Redirect

Представляет источник ввода дочернего процесса или назначение вывода дочернего процесса.

Конструкторы

Конструктор и описание
ProcessBuilder(List<String> command)

Создаёт создатель процесса со указанной программой операционной системы и аргументами.

ProcessBuilder(String... command)

Создаёт создатель процесса со указанной программой операционной системы и аргументами.

Методы

Модификатор и тип Метод и описание
List<String> command()

Возвращает программу операционной системы и аргументы этого создателя процесса.

ProcessBuilder command(List<String> command)

Устанавливает программу операционной системы и аргументы этого создателя процесса.

ProcessBuilder command(String... command)

Устанавливает программу операционной системы и аргументы этого создателя процесса.

File directory()

Возвращает рабочий каталог этого создателя процесса.

ProcessBuilder directory(File directory)

Устанавливает рабочий каталог этого создателя процесса.

Map<String,String> environment()

Возвращает представление отображения строки среды этого создателя процесса.

ProcessBuilder inheritIO()

Устанавливает источник и место назначения стандартного ввода/вывода дочернего процесса, которые соответствуют текущему процессу 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()

Запускает новый процесс, используя атрибуты этого создателя процесса.

Методы, унаследованные от класса java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Конструкторы

ProcessBuilder

public ProcessBuilder(List<String> command)

Создаёт обработчик процесса со заданной программой операционной системы и аргументами. Этот конструктор не создаёт копию списка command. Последующие изменения списка будут отражаться в состоянии обработчика процесса. Не проверяется, соответствует ли command допустимой команде операционной системы.

Параметры:
command - список, содержащий программу и её аргументы
Исключения:
NullPointerException - если аргумент равен null

ProcessBuilder

public ProcessBuilder(String... command)

Создаёт обработчик процесса со заданной программой операционной системы и аргументами. Это удобный конструктор, который устанавливает команду обработчика процесса в список строк, содержащий те же строки, что и массив command, в том же порядке. Не проверяется, соответствует ли command допустимой команде операционной системы.

Параметры:
command - массив строк, содержащий программу и её аргументы

Методы

command

public ProcessBuilder command(List<String> command)

Устанавливает программу операционной системы и аргументы для этого обработчика процесса. Этот метод не создаёт копию списка command. Последующие изменения списка будут отражаться в состоянии обработчика процесса. Не проверяется, соответствует ли command допустимой команде операционной системы.

Параметры:
command - список, содержащий программу и её аргументы
Возвращает:
этот обработчик процесса
Исключения:
NullPointerException - если аргумент равен null

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(java.lang.Object) и Object.hashCode().

Возвращаемая карта, как правило, регистрозависимая на всех платформах.

Если существует менеджер безопасности, вызывается его метод checkPermission с разрешением RuntimePermission("getenv.*"). Это может привести к тому, что будет выброшено исключение SecurityException.

При передаче информации подпроцессу Java, свойства системы предпочтительнее переменных среды.

Возвращает:
среда этого обработчика процесса
Исключения:
SecurityException - если менеджер безопасности существует и его метод checkPermission не позволяет получить доступ к среде процесса
См. также:
Runtime.exec(String[],String[],java.io.File), System.getenv()

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()

Устанавливает источник и направление стандартного ввода/вывода подпроцесса такими же, как у текущего процесса Java.

Это метод для удобства. Вызов вида

pb.inheritIO()
ведет себя точно так же, как вызов
pb.redirectInput(Redirect.INHERIT)
   .redirectOutput(Redirect.INHERIT)
   .redirectError(Redirect.INHERIT)
. Это обеспечивает поведение, эквивалентное поведению большинства командных интерпретаторов операционных систем или стандартной функции C-библиотеки system().
Возвращает:
этот обработчик процессов
С:
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().

Этот метод проверяет, является ли команда допустимой командой операционной системы. Какие команды являются допустимыми, зависит от системы, но по крайней мере команда должна быть непустым списком непустых строк.

На некоторых операционных системах может потребоваться минимальный набор зависимых от системы переменных среды. В результате подпроцесс может унаследовать дополнительные настройки переменных среды, помимо тех, которые указаны в environment() обработчика процессов.

Если существует менеджер безопасности, его метод checkExec вызывается с первым элементом массива command этого объекта в качестве аргумента. Это может привести к тому, что будет выброшено исключение SecurityException.

Запуск процесса операционной системы сильно зависит от системы. Среди многих возможных проблем:

  • Файл программы операционной системы не найден.
  • Доступ к файлу программы запрещён.
  • Рабочая директория не существует.

В таких случаях будет выброшено исключение. Точный тип исключения зависит от системы, но он всегда будет подклассом IOException.

Последующие изменения в этом обработчике процессов не повлияют на возвращённый объект Process.

Возвращает:
новый объект Process для управления подпроцессом
Исключение:
NullPointerException - если элемент списка команд имеет значение null
IndexOutOfBoundsException - если команда является пустым списком (имеет размер 0)
SecurityException - если менеджер безопасности существует и
  • его метод checkExec не разрешает создание подпроцесса или
  • стандартный ввод подпроцесса был перенаправлен из файла с помощью checkRead и метод менеджера безопасности checkWrite запрещает чтение файла, или
  • стандартный вывод или вывод ошибок подпроцесса был перенаправлен в файл с помощью IOException и метод менеджера безопасности Runtime.exec(String[], String[], java.io.File) запрещает запись в файл
IOException - если произошла ошибка ввода/вывода
См. также:
Runtime.exec(String[], String[], java.io.File)

© 1993, 2020, 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API