Эта внешняя программа написана на Python, она создает новые файлы и отправляет некоторые сообщения через stdout и stderr во время обработка. Для меня это черный ящик.
Когда я запускаю pythonStuff.exe непосредственно из командной строки или с помощью PowerShell, я вижу результат:
Код: Выделить всё
This is standard output
This is a message from stderr
This is standard output
This is standard output
This is a message from stderr
Но когда я вызываю pythonStuff.exe из своей Java-программы часть stderr всегда находится вверху, за ней следует часть stdout:
Код: Выделить всё
This is a message from stderr
This is a message from stderr
This is standard output
This is standard output
This is standard output
Как решить эту проблему?
Я попробовал несколько разных подходов:
- Классы CommanLine и DefaultExecutor + PumpStreamHandler из библиотеки Apache Commons и с ними разные варианты.
- ProcessBuilder и Process:
- особенно processBuilder.redirectErrorStream(true) иprocessBuilder.inheritIO()
- Два дополнительных потока для чтения из stdout и stderr
- Использование cmd.exe в качестве промежуточного уровня в Java:
Код: Выделить всё
new ProcessBuilder("cmd.exe", "/c", "pythonStuff.exe", "configForPythonStuff.json") - Дополнительные потоки для чтения из stdout и stderr и записи в один файл синхронизированными блоками.
Интересно то, что когда я использовал PowerShell в своей программе Java в качестве промежуточного уровня без флаг -NoNewWindow, я смог увидеть вывод в новом окне. И вывод был правильным:
Код: Выделить всё
This is standard output
This is a message from stderr
This is standard output
This is standard output
This is a message from stderr
Подробнее здесь: https://stackoverflow.com/questions/790 ... va-program
Мобильная версия