2011-01-19 10 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"); 
    } 
} 

。これは、ファイルTEXT.TXTにHelloWorld1とHelloWorld2を印刷するようになっています。しかし、私がファイルを見ると、私はHelloWorld1しか見ることができません。

  1. HelloWorld2はどこに行きましたか?それは薄い空気に消えましたか?

  2. HelloWorld2をtest.txtにリダイレクトしたいとします。私はファイルを既に開いているエラーを取得するので、単にコマンドに ">> test.txt"を追加することはできません。だから私はこれをどうやってやるの?

+0

ランタイムを使用する必要がありますか? – Navi

+0

@Navi:代替はありますか? Tell。私は知りたいです!または、ProcessBuilderを使用することを意味しますか? –

答えて

33

Runtime.execの標準出力は自動的に呼び出し元の標準出力に送られません。

何かこれはやりたいことです。フォークされたプロセスの標準出力にアクセスし、読み込んで書き出します。 forkされたプロセスからの出力は、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()を呼び出して生成した新しいプロセスのstdoutではありません。 "HelloWorld2"を見たい場合は、exec()コールから返されたプロセスを取得し、それからgetOutputStream()をコールする必要があります。

5

JDK 1.5以降、stdストリームとerrストリームも処理するjava.lang.ProcessBuilderがあります。これはjava.lang.Runtimeの代わりのものです。あなたはそれを使用していなければなりません。

関連する問題