Библиотека классов 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 для большинства программ), так как нет исключение вызывается, если процесс выходит из строя.
Также обратите внимание, что дополнительный код часто необходимо правильно управлять процессом входы/выходы, как описано в documentation for the Process
class (курсив добавлен):
По умолчанию создается подпроцесс не имеет своего собственного терминала или консоль. Все его стандартные операции ввода-вывода (т. Е. Stdin, stdout, stderr) будут перенаправлены на родительский процесс, где к ним можно получить доступ через потоки, полученные с помощью методов getOutputStream(), getInputStream() и getErrorStream(). Родительский процесс использует эти потоки для подачи ввода и получения вывода из подпроцесса. Поскольку некоторые собственные платформы обеспечивают ограниченный размер буфера для стандартных потоков ввода и вывода, отказ в быстрой записи потока ввода или чтение выходного потока подпроцесса может привести к блокировке подпроцесса или даже к взаимоблокировке.
Один из способов, чтобы убедиться, что I/O обработан правильно и что значение выхода указует на успех использовать библиотеку как jproc
, которая занимается тонкостями захвата стандартного вывода и стандартного потока ошибок, и предлагает простой синхронный интерфейс запускать внешние процессы:
ProcResult result = new ProcBuilder("processname").run();
jproc
доступна через мавена центральный:
<dependency>
<groupId>org.buildobjects</groupId>
<artifactId>jproc</artifactId>
<version>2.2.0</version>
</dependency>
Обратите внимание, что вы должны использовать форму '.exec (String [])' метода , а не одна строка '.exec (String)' form, которая * не является процессором командной строки * - она просто разбивается на пробелы. Они дают тот же результат для этого примера 'tree.com/A', но отличаются, если задано, например, имя файла, в котором есть пробелы. –
Вы также должны очистить поток ошибок и, при необходимости, дождаться выходного значения процесса. –