ProcessBuilder перенаправлен на стандартный вывод

Я хотел бы перенаправить вывод процесса Java на стандартный вывод родительского процесса Java.

Используя класс ProcessBuilder следующим образом:

public static void main(String[] args) {
  ProcessBuilder processBuilder = new ProcessBuilder("cmd");
  processBuilder.directory(new File("C:"));   
  processBuilder.redirectErrorStream(true); // redirect error stream to output stream
  processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
}

Я ожидал, что результаты «cmd», такие как:

Microsoft Windows [версия 6.1.7601] Copyright (c) Microsoft Corporation, 2009 г. Tous droits reservés.

отображаются в консоли DOS, используемой для запуска программы Java. Но в DOS Console вообще ничего не отображается.

В других ветках обсуждений я видел решения с использованием класса BufferedReader: но здесь я бы хотел, чтобы результаты процесса напрямую отображались в стандартном выводе, без использования какого-либо BufferedReader или «цикла чтения». Является ли это возможным?

Спасибо.


person John    schedule 21.04.2013    source источник
comment
Посмотрите в API для класса System методы, которые вам понадобятся: setOut(...), setIn(...), setErr(...).   -  person Hovercraft Full Of Eels    schedule 21.04.2013
comment
Это должно сработать. Не понимаю, почему бы и нет.   -  person Qix - MONICA WAS MISTREATED    schedule 23.07.2013


Ответы (2)


Попробуйте ProcessBuilder.inheritIO() использовать тот же ввод-вывод, что и текущий процесс Java. Кроме того, вы можете использовать гирляндную цепочку методов:

ProcessBuilder pb = new ProcessBuilder("cmd")
    .inheritIO()
    .directory(new File("C:"));
pb.start();
person Renaud    schedule 20.01.2015
comment
Только одна сноска для моей информации - если вы позвоните pb.destroy() слишком рано после этого, вы ничего не напечатаете (даже если вы позвоните System.out.flush()); - person Sridhar Sarnobat; 07.10.2015

Вы пропустили ключевую часть, вам действительно нужно запустить процесс и дождаться вывода. Я верю, что это сработает,

processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
// Start the process.
try {
  Process p = processBuilder.start();
  // wait for termination.
  p.waitFor();
} catch (IOException e) {
  e.printStackTrace();
} catch (InterruptedException e) {
  e.printStackTrace();
}
person Elliott Frisch    schedule 27.12.2013