Альтернатива Runtime.exec() для полного консольного java-приложения?

Я пытался закодировать приложение, которое позволяет мне открывать несколько сеансов консоли (в окнах, которые будут cmd.exe) в режиме вкладок.

Одна из наиболее важных ссылок, которые я нашел, находится в следующем URL-адресе, где я смог получить код TextAreaOutputStream, чтобы иметь возможность читать STDOUT из процесса, но это и большинство ссылок в Интернете не решает/исправляет вопрос, которым я занимаюсь.

Ссылка: Создание консоли Java внутри Панель графического интерфейса

Даже когда перенаправление STDOUT, STDERR и STDIN вызвало у меня некоторые проблемы, худшая часть возникает, когда команда, которую вы вводите в консоли Java на одной из вкладок, выполняет команду, которая создает дочерний процесс, именно здесь мои Java-приложения теряют контроль, потому что в фоновом режиме был создан новый процесс. По сути, новый дочерний процесс выходит за рамки, и я не могу получить или отправить ему какие-либо байты, и мое приложение зависает.

  • JVM
    • MyTabbedConsoleApp
      • cmd.exe /k (I can still communicate with this one, no problems until here)
        • apptrack.exe (a child process out of bound from my app, no communication with this, the app hangs)

Я ищу лучший способ создать приложение, которое в значительной степени имитирует среду консоли.


person mat060    schedule 30.01.2015    source источник
comment
В отличие от форумов, мы не используем слова «Спасибо» или «Любая помощь приветствуется» или подписи на Stack Overflow. См. раздел Должен ли быть "Привет", "спасибо" слоганов и приветствий удалить из постов?. Кстати, это заранее спасибо, а не спасибо заранее.   -  person John Saunders    schedule 31.01.2015


Ответы (1)


Вы должны использовать ProcessBuilder вместо Runtime, так как это рекомендуемый API для работы с процессами операционных систем.

Ознакомьтесь с разделом Изменения в Runtime.exec для Java. Примечания к выпуску 6u45.

Предпочтительный способ создания процессов операционных систем, начиная с JDK 5.0, — использование java.lang.ProcessBuilder. Класс ProcessBuilder имеет гораздо более полный API для настройки среды, рабочего каталога и перенаправления потоков для процесса.

person Evandro Pomatti    schedule 30.01.2015
comment
Знаете ли вы, поддерживает ли ProcessBuilder перенаправление канала в случае, если основной процесс выполняется или создает внутри другую консоль или подпроцесс (вложенные процессы). Моя основная проблема с Runtime.exec заключалась в том, что если процесс mi создавал другой подпроцесс, основной процесс неопределенно ждал подпроцесса, и у меня не было информации stdout от подпроцесса. - person mat060; 27.09.2017
comment
@mat060 mat060 Я не знаю об этом, вы должны открыть для этого отдельный вопрос. - person Evandro Pomatti; 28.09.2017