Начиная процесс в Java? - PullRequest
       16

Начиная процесс в Java?

29 голосов
/ 23 сентября 2010

Есть ли способ запустить процесс в Java?в .Net это делается, например, с:

System.Diagnostics.Process.Start("processname");

Есть ли в Java эквивалент, чтобы я мог затем позволить пользователю найти приложение, и тогда оно будет работать для любой ОС?

Ответы [ 3 ]

29 голосов
/ 23 сентября 2010

http://www.rgagnon.com/javadetails/java-0014.html

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.nio.file.Paths;

public class CmdExec {

public static void main(String args[]) {
    try {
        // enter code here

        Process p = Runtime.getRuntime().exec(
            Paths.get(System.getenv("windir"), "system32", "tree.com /A").toString()
        );

        // enter code here

        try(BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
            String line;

            while ((line = input.readLine()) != null) {
                System.out.println(line);
            }
        }

    } catch (Exception err) {
        err.printStackTrace();
    }
  }
}

Вы можете получить локальный путь, используя свойства системы или аналогичный подход.

http://download.oracle.com/javase/tutorial/essential/environment/sysprop.html

22 голосов
/ 23 сентября 2010

См. Runtime.exec() и класс Process. В простейшем виде:

Process myProcess = Runtime.getRuntime().exec(command);
...

Обратите внимание, что вам также необходимо прочитать выходные данные процесса (например: myProcess.getInputStream()), иначе процесс будет зависать в некоторых системах. В первый раз это может сильно сбить с толку и должно быть включено в любое введение в эти API. См. Пример ответа Джеймса П.

Возможно, вы захотите взглянуть на новый класс ProcessBuilder, который упрощает изменение переменных среды и вызывает подпроцессы:

Process myProcess = new ProcessBuilder(command, arg).start();
...
14 голосов
/ 18 августа 2016

Библиотека классов 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...