Библиотека классов Java представляет внешние процессы, используя класс java.lang.Process
. Процессы могут порождаться с использованием java.lang.ProcessBuilder
:
Process process = new ProcessBuilder("processname").start();
или более старый интерфейс, предоставляемый перегруженными exec
методами класса java.lang.Runtime
:
Process process = Runtime.getRuntime().exec("processname");
Оба эти фрагмента кода будут порождать новый процесс, который обычно выполняется асинхронно и с которым можно взаимодействовать через результирующий объект Process
. Если вам нужно проверить, что процесс завершен (или дождаться его завершения), не забудьте проверить, что значение выхода (код выхода) возвращается process.exitValue()
или process.waitFor()
соответствует ожидаемому значению (0 для большинства программ), поскольку исключение не выдается, если процесс завершается ненормально.
Также обратите внимание, что для правильной обработки операций ввода-вывода процесса часто необходим дополнительный код, как описано в документации для Process
класса (выделение добавлено):
По умолчанию созданный подпроцесс не имеет собственного терминала или консоли. Все его стандартные операции ввода-вывода (т.е. операции stdin, stdout, stderr) будут перенаправлены в родительский процесс, где к ним можно получить доступ через потоки, полученные с помощью методов getOutputStream (), getInputStream () и getErrorStream (). Родительский процесс использует эти потоки для подачи входных данных и получения выходных данных из подпроцесса. Поскольку некоторые собственные платформы предоставляют ограниченный размер буфера только для стандартных входных и выходных потоков, невозможность оперативной записи входного потока или чтения выходного потока подпроцесса может привести к блокировке подпроцесса или даже к тупиковой ситуации .
Один из способов убедиться, что ввод-вывод правильно обработан и что значение выхода указывает на успех, - это использовать библиотеку, подобную jproc
, которая имеет дело со сложностями захвата stdout и stderr и предлагает простой синхронный интерфейс для запуска внешних процессов:
ProcResult result = new ProcBuilder("processname").run();
jproc
доступно через центральный Maven:
<dependency>
<groupId>org.buildobjects</groupId>
<artifactId>jproc</artifactId>
<version>2.2.0</version>
</dependency>