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

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

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

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

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

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

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

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

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

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

Библиотека classов Java представляет собой внешние процессы, используя class java.lang.Process . Процессы могут быть созданы с помощью java.lang.ProcessBuilder :

 Process process = new ProcessBuilder("processname").start(); 

или более старый интерфейс, открытый перегруженными методами exec в classе java.lang.Runtime :

 Process process = Runtime.getRuntime().exec("processname"); 

Оба эти fragmentа кода будут порождать новый процесс, который обычно выполняется асинхронно и может взаимодействовать через результирующий объект Process . Если вам нужно проверить завершение процесса (или дождаться его завершения), не забудьте проверить, что значение выхода (код выхода), возвращаемое process.exitValue() или process.waitFor() , как и ожидалось ( 0 для большинства программ), поскольку исключение не возникает, если процесс выходит из строя ненормально.

Также обратите внимание, что для правильной обработки ввода-вывода процесса часто требуется дополнительный код, как описано в документации для classа Process (выделено мной):

По умолчанию созданный subprocess не имеет собственного терминала или консоли. Все его стандартные операции ввода-вывода (т.е. stdin, stdout, stderr) будут перенаправлены на родительский процесс, к которым можно получить доступ через streamи, полученные с помощью методов getOutputStream (), getInputStream () и getErrorStream (). Родительский процесс использует эти streamи для подачи ввода и получения вывода из subprocessа. Поскольку некоторые собственные платформы обеспечивают ограниченный размер буфера для стандартных streamов ввода и вывода, неспособность оперативно записать входной stream или прочитать выходной stream subprocessа, может привести к блокировке subprocessа или даже к взаимоблокировке .

Один из способов убедиться в правильности обработки ввода-вывода и о том, что значение выхода указывает на успешность использования библиотеки jproc которая имеет дело с сложностями захвата stdout и stderr и предлагает простой синхронный интерфейс для запуска внешних процессов:

 ProcResult result = new ProcBuilder("processname").run(); 

jproc доступен через maven central:

  org.buildobjects jproc 2.2.0  

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

 Process p = Runtime.getRuntime().exec(System.getenv("windir") + "\\system32\\" + "calc.exe"); 
  • Подождите, пока процесс не завершится
  • Получить возвращаемое значение из процесса
  • Как Ctrl-C завершает дочерний процесс?
  • Как определить владельца процесса на C #?
  • Как обрезать расширение файла из String в Java?
  • Асинхронный процесс начнется и дождитесь его завершения
  • Связь между двумя различными процессами в Node.js
  • Муфтезы pthread работают через streamи, если в общей памяти?
  • Как записать вывод в переменную из внешнего процесса в PowerShell?
  • Как убить процесс с помощью Vb.NET или C #?
  • Перенаправление стандартного ввода консольного приложения
  • Давайте будем гением компьютера.