У меня проблема с интерактивным процессом на Java. У меня есть потоки для чтения STDOUT и STDERR и поток для обработки ввода для процесса. Но в потоке STDOUT нет данных, пока процесс не завершится. Затем весь вывод печатается сразу.Java exec - вывод интерактивного процесса продолжается до завершения процесса
DBG | Pipe action-STDERR started
DBG | Pipe action-STDIN started
DBG | Pipe action-STDOUT started
STDIN | Try to put some input.
STDIN | I cannot see any output.
STDIN | Nevertheless the interaction works.
STDIN | It works on background.
STDIN | Let's terminate the process to see the truth.
STDIN | quit
STDOUT | Enter some text, please: The text is 'Try to put some input.'
STDOUT | Enter some text, please: The text is 'I cannot see any output.'
STDOUT | Enter some text, please: The text is 'Nevertheless the'
STDOUT | Enter some text, please: The text is 'interaction works.'
STDOUT | Enter some text, please: The text is 'It works on background.'
STDOUT | Enter some text, please: The text is 'Let's terminate the process to see the truth.'
STDOUT | Enter some text, please: The text is 'quit'
STDOUT | Bye!
DBG | Trying to kill thread action-STDOUT
DBG | Trying to kill thread action-STDERR
DBG | Trying to kill thread action-STDIN
DBG | Pipe action-STDERR finished
DBG | Finished
DBG | Pipe action-STDIN finished
DBG | Pipe action-STDOUT finished
Линии, начинающиеся с STDOUT, представляют собой линии, написанные процессом. Строки с префиксом STDIN - это строки, написанные мной. Строки, предваряемые DBG, являются строками, написанными проверенной программой Java в качестве отладочной информации. Попробуем выполнить тот же процесс в системной консоли.
Поведение полностью оправдывает мое ожидание. Меня попросили внести свой вклад. Я делаю это и получаю ответ.
Я удивлен, что нашел несколько сообщений в Интернете, включая Stackoverflow, но без ответа, помеченного как приемлемое решение. (Например, Problem reading InputStream from Java Process.) Кажется, разработчики Java никогда не занимались выполнением интерактивного процесса. Странно, что вывод неинтерактивного процесса (как ping) появляется последовательно, а процесс выполняется. Без каких-либо проблем. Но когда процесс ждет ввода пользователя, выход каким-то образом блокируется.
Каков другой процесс («сервер»), написанный на нем, и не заставляет ли он каждый раз выгружать его стандартную версию? –
Наверное, нет, но этот процесс является черным ящиком на этом уровне. Не имеет значения, удаляет ли он свои выходы или нет, потому что я не могу повлиять на него. Я должен решить проблему внутри кода Java. –