Это в контексте локальной программы Processing. Я хотел бы запустить внешнюю программу для получения некоторых данных. Есть ли функция popen() или аналогичная, которую я могу использовать?
Java: функция, похожая на popen()?
Ответы (3)
Process process = Runtime.getRuntime().exec("your command");
Затем вы можете читать и записывать данные, используя Process
а> потоки.
JDK5 представил ProcessBuilder для большего контроля над процессом. поколение.
Process process = new ProcessBuilder(command).start()
Имейте в виду, что внутренне вызывается forkAndExec, и fork "создает копию всего родительского адресного пространства", так что даже небольшая команда может привести к OutOfMemoryErrors, когда родительский процесс получает большой объем памяти.
Близким другом 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
для каждого <(...)
или >(...)
использования. К сожалению, довольно сложно определить, когда их можно удалить без эффекта (фьюзер?)!