打印运行时exec()OutputStream到控制台

时间:2010-10-14 17:51:23

标签: java stream runtime runtime.exec printstream

我正在尝试将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 个答案:

答案 0 :(得分:94)

我最近遇到了这个问题,只是想提一下,因为java 7 process builder api已经扩展了。现在可以通过以下方法解决此问题:

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

我希望这会有所帮助:)

答案 1 :(得分:35)

我相信这就是你要找的东西:

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

答案 2 :(得分:12)

我遇到了类似的问题,我正在使用以下代码。

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

答案 3 :(得分:2)

VerboseProcess尝试jcabi-log

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

该类启动后台线程,侦听输出流并记录它。

答案 4 :(得分:1)

在调用process.waitFor()

之后,您需要启动一个新线程来读取终端输出流并将其复制到控制台

答案 5 :(得分:1)

如果你可以使用commons-io的org.apache.commons.io.IOUTils,

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

答案 6 :(得分:0)

我知道这是一个非常老的问题,但是上述答案的更好替代方法是

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

根据ProcessBuilder.inheritIO()的文档,

  

将子流程标准I / O的源和目标设置为   与当前Java进程相同。

希望这对某人有帮助!