Java: функция, похожая на popen()?

Это в контексте локальной программы Processing. Я хотел бы запустить внешнюю программу для получения некоторых данных. Есть ли функция popen() или аналогичная, которую я могу использовать?


person Mark Harrison    schedule 22.05.2010    source источник


Ответы (3)


Process process = Runtime.getRuntime().exec("your command");

Затем вы можете читать и записывать данные, используя Process потоки.

person Bozho    schedule 22.05.2010

JDK5 представил ProcessBuilder для большего контроля над процессом. поколение.

Process process = new ProcessBuilder(command).start()

Имейте в виду, что внутренне вызывается forkAndExec, и fork "создает копию всего родительского адресного пространства", так что даже небольшая команда может привести к OutOfMemoryErrors, когда родительский процесс получает большой объем памяти.

см. здесь

person phi    schedule 09.01.2014
comment
Не могли бы вы добавить ссылку на документацию ProcessBuilder? - person jwfearn; 06.03.2015

Близким другом popen() является создание именованного канала в качестве ввода и/или вывода, как в UNIX:

mknod /tmp/mypipe.12345 p ; sort -o /tmp/mypipe.12345 /tmp/mypipe.12345 &

Затем открыть /tmp/mypipe.12345, написать, закрыть, открыть /tmp/mypipe.12345, прочитать, закрыть. Поскольку сортировка не может ничего записывать до EOF на входе, открытие вывода произойдет после закрытия ввода. Вызов popen() не может этого сделать!

Для более простых сценариев именованный канал можно просто прочитать или записать.

Конечно, его еще нужно открутить, как в system(...) звонке.

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

/tmp является общим, поэтому конфликты имен вполне возможны. Вы можете сгенерировать частично случайное имя файла канала (числовая часть /tmp/mypipe.12345) в Java, чтобы предотвратить это. В некоторых системах Bash создает именованные каналы в /var/tmp для каждого <(...) или >(...) использования. К сожалению, довольно сложно определить, когда их можно удалить без эффекта (фьюзер?)!

person David G. Pickett    schedule 21.08.2019