2010-10-14 3 views
25

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

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

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(); 
     } 
    } 
} 

ответ

2

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

+3

Для всех подходит к этому вопросу в настоящее время: прокрутка вниз, есть лучший ответ ниже – forresthopkinsa

32

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

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(); 
+1

У меня есть вопрос ваше решение: нет ли необходимости использовать process.waitFor()? Он работает и без, но почему? Запускает ли InputStreamReader до конца потока? –

+2

Да, API: _ Если байт не доступен, поскольку конец потока достигнут, возвращается значение -1. Этот метод блокируется до тех пор, пока не будут доступны входные данные, обнаружен конец потока или исключено исключение ._ –

+0

добавьте 'redirectErrorStream (true)' для полноты. –

74

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

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

Я надеюсь, что это помогает :)

+2

Идеальный и элегантный ответ. Если вы можете использовать Java 7, это абсолютно путь. – Shane

+0

Это лучший ответ, хотя есть и хорошие, всегда старайтесь использовать инструменты, которые входят в набор инструментов Java по умолчанию. Java 7/8 - чрезвычайно мощный и мощный язык - с постоянно расширяющимся, но эффективным инструментарием. – DtechNet

11

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

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

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

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

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

0

Если вы можете использовать org.apache.commons.io.IOUTils из Викисклада гипергликемии,

System.out.println(IOUtils.toString(process.getInputStream())); 
System.err.println(IOUtils.toString(process.getErrorStream())); 

 Смежные вопросы

  • Нет связанных вопросов^_^