2016-08-04 1 views
1

Я запускаю внешний процесс из java, используя стандарт java.lang.Process. Я пытаюсь выяснить, каков результат процесса, но в формате, который сочетает в себе как stdout, так и stderr.Запуск внешнего процесса с Java: stdout и stderr

В настоящее время у меня есть Process#getInputStream, который обеспечивает доступ к stdout и Process#getErrorStream, что обеспечивает доступ к stderr. Это все хорошо, за исключением того, что мы не можем заказать вывод из stdout и stderr по их метке времени.

Say процесс имеет выход так:

  • Одна линия (А) записывается в стандартный вывод
  • Одна линия (B) записывается в стандартный вывод
  • Одна линия (C) на стандартный вывод

Java не позволит нам знать, что строка (B) была записана после (A) и до (C). Я хотел бы знать, есть ли способ слияния stdout и stderr внешнего процесса, чтобы мы знали, в каких операциях заказа были напечатаны для вывода.

+0

Просто быстро q, Являются ли эти выходы процессов, которые невозможно захватить на Java? Поскольку в противном случае это уровни журналов, которые вы последовательно отмечали в файлах журналов –

ответ

2

Если вы используете API ProcessBuilder вместо обычного Runtime.exec(), вы можете перенаправить выходные и потоки ошибок, в том числе перенаправить их в один и тот же поток.

ProcessBuilder pb = 
    new ProcessBuilder("myCommand", "myArg1", "myArg2"); 
pb.redirectErrorStream(true); // merges err with out 
pb.redirectOutput(Redirect.appendTo(new File("out.txt"))); 
Process p = pb.start(); 
p.waitFor(); 
0

ProcessBuilder.redirectErrorStream (true); не работает должным образом - на моем компьютере (Windows 10, Java 8) при внешнем выполнении программы perl все предупреждения и сообщения об ошибках отображаются перед любым другим выходом, независимо от того, что такое реальный заказ, и независимо от того, будет ли он содержать cmd/c или нет, выполнение изнутри пакета или нет, даже переадресация коммутатора 2> & 1 внутри пакета не помогает

+0

Magdute, это не похоже на ответ на исходный вопрос. Вы пытаетесь получить ответ на свою собственную проблему? Если да, то вы должны создать отдельный вопрос. – sesm