Создание процесса с помощью метода, называемого Java [duplicate]

После загрузки скрипта он ищет внутри своего собственного тега скрипта доступ к его контенту.

Он будет использовать некоторый код, подобный этому:

  var scripts =  document.getElementsByTagName ( "сценарий");  var data = eval (скрипты [scripts.length - 1] .innerHTML);   

Предоставлено John Resig .

26
задан Chris 3 May 2014 в 01:30
поделиться

4 ответа

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

26
ответ дан James P. 17 August 2018 в 13:06
поделиться
  • 1
    Обратите внимание, что вы должны использовать форму .exec(String[]) метода, а не одну строку .exec(String), которая не является процессором командной строки - она ​​просто разбивается на пробелы. Они дают тот же результат для этого примера tree.com /A, но отличаются, если задано, например, имя файла, в котором есть пробелы. – Stephen P 23 September 2010 в 02:05
  • 2
    Вы также должны очистить поток ошибок и, если необходимо, дождаться выходного значения процесса. – Giovanni Botta 17 July 2013 в 20:23
  • 3
    – Evgeny Lebedev 3 October 2018 в 09:23
  • 4
  • 5

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

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

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

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 central:

<dependency>
      <groupId>org.buildobjects</groupId>
      <artifactId>jproc</artifactId>
      <version>2.2.0</version>
</dependency>
11
ответ дан Ben Barnard 17 August 2018 в 13:06
поделиться

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

Process p = Runtime.getRuntime().exec(System.getenv("windir") + "\\system32\\" + "calc.exe");
0
ответ дан Lova Chittumuri 17 August 2018 в 13:06
поделиться

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

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

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

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

Process myProcess = new ProcessBuilder(command, arg).start();
...
20
ответ дан NullUserException 17 August 2018 в 13:06
поделиться
  • 1
    Вам также необходимо прочитать выход процесса - p.getInputStream () - или процесс будет зависать в некоторых системах. Это может быть очень запутанным в первый раз и должно быть включено в любое введение в эти API. См. Ответ Джеймса П. для примера. – Andy Thomas 23 September 2010 в 01:08
  • 2
    @ Энди Спасибо. Я включил ваш комментарий в свой ответ, если вы не возражаете. – NullUserException 23 September 2010 в 01:15
  • 3
    что если медиаплеером по умолчанию является VLC, и я хочу, например, открыть «somevideo.avi». и я хочу, чтобы он использовал приложение по умолчанию, которое является vlc? – jmasterx 23 September 2010 в 01:19
  • 4
Другие вопросы по тегам:

Похожие вопросы: