Печать Runtime exec () OutputStream в консоль - PullRequest
34 голосов
/ 14 октября 2010

Я пытаюсь получить OutputStream из Process, инициированного exec(), на консоль. Как это можно сделать?

Вот неполный код:

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.Reader;

public class RuntimeTests
{
    public static void main(String[] args)
    {
        File path = new File("C:\\Dir\\Dir2");
        String command = "cmd /c dir";
        Reader rdr = null;
        PrintStream prtStrm = System.out;
        try
        {
            Runtime terminal = Runtime.getRuntime();

            OutputStream rtm = terminal.exec(command, null, path).getOutputStream();
            prtStrm = new PrintStream(rtm);
            prtStrm.println();
        } 
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

Ответы [ 7 ]

95 голосов
/ 30 августа 2012

Я недавно столкнулся с этой проблемой и просто хотел упомянуть, что начиная с Java 7, компоновщик процессов API был расширен. Теперь эту проблему можно решить с помощью:

ProcessBuilder pb = new ProcessBuilder("yourcommand");
pb.redirectOutput(Redirect.INHERIT);
pb.redirectError(Redirect.INHERIT);
Process p = pb.start();

Надеюсь, это поможет:)

35 голосов
/ 10 октября 2011

Я считаю, что это то, что вы ищете:

  String line;
  Process p = Runtime.getRuntime().exec(...);
  BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
  while ((line = input.readLine()) != null) {
    System.out.println(line);
  }
  input.close();
12 голосов
/ 16 октября 2012

Я столкнулся с подобной проблемой, и я использую следующий код.

Process p = Runtime.getRuntime().exec(".....");
p.waitFor();

String line;

BufferedReader error = new BufferedReader(new InputStreamReader(p.getErrorStream()));
while((line = error.readLine()) != null){
    System.out.println(line);
}
error.close();

BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while((line=input.readLine()) != null){
    System.out.println(line);
}

input.close();

OutputStream outputStream = p.getOutputStream();
PrintStream printStream = new PrintStream(outputStream);
printStream.println();
printStream.flush();
printStream.close();
2 голосов
/ 22 июня 2013

Попробуйте VerboseProcess из jcabi-log :

String output = new VerboseProcess(new ProcessBuilder("foo.bat")).stdout();

Класс запускает фоновый поток, прослушивает выходной поток и регистрирует его.

1 голос
/ 15 февраля 2016

Если вы можете использовать org.apache.commons.io.IOUTils от commons-io,

System.out.println(IOUtils.toString(process.getInputStream()));
System.err.println(IOUtils.toString(process.getErrorStream()));
1 голос
/ 14 октября 2010

Вам нужно запустить новый поток, который будет читать поток вывода терминала и скопировать его в консоль после вызова process.waitFor ()

0 голосов
/ 09 июня 2019

Я знаю, что это очень старый вопрос, но лучшей альтернативой для приведенных выше ответов будет

ProcessBuilder builder = new ProcessBuilder(command);
builder.inheritIO();
Process p = builder.start();

Из документов ProcessBuilder.inheritIO(),

Устанавливает источник и назначение для стандартного ввода-вывода подпроцесса, чтобы быть такие же, как у текущего процесса Java.

Надеюсь, это кому-нибудь поможет!

...