Подтвердить что ты не робот

Запуск процесса в Java?

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

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

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

4b9b3361

Ответ 1

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

import java.io.*;
public class CmdExec {

  public static void main(String args[]) {
    try {
      String line;
      Process p = Runtime.getRuntime().exec
        (System.getenv("windir") +"\\system32\\"+"tree.com /A");
      BufferedReader input =
        new BufferedReader
          (new InputStreamReader(p.getInputStream()));
      while ((line = input.readLine()) != null) {
        System.out.println(line);
      }
      input.close();
    }
    catch (Exception err) {
      err.printStackTrace();
    }
  }
}

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

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

Ответ 2

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

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

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

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

Process myProcess = new ProcessBuilder(command, arg).start();
...

Ответ 3

Библиотека классов 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>

Ответ 4

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

Process p = Runtime.getRuntime().exec(System.getenv("windir") + "\\system32\\" + "calc.exe");