#java #communication #external-process
#java #Информационные материалы #внешний процесс
Вопрос:
Я хотел бы запустить внешнее стороннее приложение из моего Java-приложения. Это внешнее приложение должно выполняться все время, пока выполняется мое Java-приложение.
Время от времени (это зависит от взаимодействия с пользователем) мое Java-приложение должно иметь возможность считывать и записывать данные в это внешнее приложение через stdin
и stdout
.
Как я могу это сделать?
Ответ №1:
По сути, вам понадобится несколько потоков в Java, которые следят за завершением внешнего процесса и которые перетасовывают его потоки ввода / вывода / ошибок, чтобы ваше основное Java-приложение имело к нему доступ.
Существуют более «базовые» способы сделать это с помощью таких классов, как Process
, но я бы предложил Apache Commons-exec, который предоставляет некоторые полезные инструменты для обработки возвращаемых значений и ввода-вывода.
Ответ №2:
Поскольку вы реализуете предложение о запуске Process
, прочитайте и реализуйте все рекомендации, когда Runtime.exec() не будет этого делать, не выполняйте.
Также рассмотрите возможность использования a ProcessBuilder
вместо Runtime.exec()
(при написании кода для 1.5 ).
Комментарии:
1. Хорошо, я довольно схож с Process и ProcessBuilder. Но как я могу получить выходные данные немедленно, когда они будут отправлены ex-app (родным приложением)? Я не могу дождаться окончания процесса ex-app.
2. @MiniKarol: Статья посвящена этому; см.
class StreamGobbler extends Thread
.
Ответ №3:
Является ли ex-app собственным кодом или другой Java-программой? Если это машинный код, посмотрите на http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Process.html и http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Runtime.html
Это позволит вам выполнять собственную программу, отслеживать ее состояние, получать ее выходные данные и отправлять ей входные данные.
Ответ №4:
Это зависит от специфики внешнего приложения, главным образом: стороннего разработчика или это то, что вы контролируете?… с чем она построена, каковы ее возможности и т.д.
«Запутанный» метод состоял бы в том, чтобы просто использовать файловую систему и заставить Java отслеживать файлы, удаленные в определенном месте (заботясь о том, чтобы надлежащим образом обрабатывать заблокированные файлы). Более сложным методом было бы осуществлять связь через сокеты или запись в таблицу базы данных в локальной / размещенной внутри базы данных, такой как hsqldb. Использование потоков ввода / вывода через java.lang.Процесс также может помочь, в зависимости от стороннего приложения, конечно.
Но опять же, все это зависит от специфики приложения, с которым вы общаетесь. Класс процесса Java не поможет, если сторонним приложением является Excel (в этом случае вам, вероятно, придется просмотреть каталог сохранения для файлов xls в соответствии с первым методом, который я упомянул).
Комментарии:
1. Это стороннее приложение, с которым я могу взаимодействовать через stdin и stdout. Протокол хорошо описан. Есть только одна проблема — мои навыки работы с Java ;).
2. Что ж, хорошей новостью в этом случае является то, что вам в любом случае не понадобится запутанное или сложное решение, описанное выше.