Внешняя программа Java

#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. Что ж, хорошей новостью в этом случае является то, что вам в любом случае не понадобится запутанное или сложное решение, описанное выше.