2011-01-19 148 views
18

我有一个程序Test.java:使用System.setOut()重定向Runtime.getRuntime()。exec()输出;

import java.io.*; 

public class Test { 
    public static void main(String[] args) throws Exception { 
     System.setOut(new PrintStream(new FileOutputStream("test.txt"))); 
     System.out.println("HelloWorld1"); 
     Runtime.getRuntime().exec("echo HelloWorld2"); 
    } 
} 

据说这是为了打印HelloWorld1和HelloWorld2到text.txt文件。但是,当我查看文件时,我只看到HelloWorld1。

  1. HelloWorld2去哪了?它消失在空气中吗?

  2. 假设我想将HelloWorld2重定向到test.txt。我不能在命令中添加一个“>> test.txt”,因为我会得到一个文件已经打开的错误。那么,我该如何做到这一点?

+0

是否需要使用运行时? – Navi 2011-01-19 23:24:48

回答

33

Runtime.exec的标准输出不会自动发送到调用者的标准输出。

类似这样的事情可以做到 - 访问分叉进程的标准输出,读取它然后写出来。请注意,使用Process实例的getInputStream()方法可以将分岔过程的输出提供给父级。

public static void main(String[] args) throws Exception { 
    System.setOut(new PrintStream(new FileOutputStream("test.txt"))); 
    System.out.println("HelloWorld1"); 

    try { 
     String line; 
     Process p = Runtime.getRuntime().exec("echo HelloWorld2"); 

     BufferedReader in = new BufferedReader(
       new InputStreamReader(p.getInputStream())); 
     while ((line = in.readLine()) != null) { 
     System.out.println(line); 
     } 
     in.close(); 
    } 
    catch (Exception e) { 
     // ... 
    } 
} 
2

System.out不是通过调用exec()生成的新进程的标准输出。如果你想看到“HelloWorld2”,你必须得到从exec()调用返回的Process,然后从中调用getOutputStream()。

5

由于JDK 1.5中有java.lang.ProcessBuilder,它也可以处理std和err流。它是java.lang.Runtime的替代品,你应该使用它。