Порядок вывода сообщений из внешнего exe в программе JavaJAVA

Программисты JAVA общаются здесь
Anonymous
Порядок вывода сообщений из внешнего exe в программе Java

Сообщение Anonymous »

У меня есть программа на Java, которой необходимо вызвать внешнюю программу, скажем, pythonStuff.exe
Эта внешняя программа написана на 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
Тот же результат, что и при вызове pythonStuff.exe, например, из GitBash.
Как решить эту проблему?
Я пробовал несколько разных подходов:
  • классы 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 и записи в один файл синхронизированными блоками.
Ни один из них не работает. Каждый раз в моей программе на Java я вижу сообщения stderr перед stdout. Почему это происходит, даже когда я вызываю pythonStuff.exe через cmd.exe?
Интересно то, что когда я использовал 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
Когда использовался флаг -NoNewWindow, выходные данные снова были неправильными, поэтому поток stderr находился перед стандартным выводом.

Подробнее здесь: https://stackoverflow.com/questions/790 ... va-program

Вернуться в «JAVA»