2012-05-02 16 views
4

私はstdinとstdoutをJavaのサブプロセスからリダイレクトしようとしていますが、結局出力はJTextAreaなどになります。stdinとstdoutをJavaでリダイレクトする

はここ

Process cmd = Runtime.getRuntime().exec("cmd.exe"); 

cmd.getOutputStream().write("echo Hello World".getBytes()); 
cmd.getOutputStream().flush(); 

byte[] buffer = new byte[1024]; 
cmd.getInputStream().read(buffer); 
String s = new String(buffer); 

System.out.println(s); 

出力は次のようになり、私の現在のコードです:私は、出力された文字列 "Hello World" を参照してください期待してい

Microsoft Windows [Version 6.1.7601] 
Copyright (c) 2009 Microsoft Corporation. All rights reserved. 

C:\(Current Directory)> 

。 親プロセスが十分長く生存していない可能性がありますか?

複数のコマンドを送受信することもできます。

答えて

9

入力ストリームでリッスンする前に出力ストリームに書き込もうとしました。何も表示されていないのが理にかなっています。これを成功させるには、2つのストリームに別々のスレッドを使用する必要があります。

すなわち、

import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.PrintWriter; 
import java.util.Scanner; 

public class Foo { 
    public static void main(String[] args) throws IOException { 
     Process cmd = Runtime.getRuntime().exec("cmd.exe"); 

     final InputStream inStream = cmd.getInputStream(); 
     new Thread(new Runnable() { 
     public void run() { 
      InputStreamReader reader = new InputStreamReader(inStream); 
      Scanner scan = new Scanner(reader); 
      while (scan.hasNextLine()) { 
       System.out.println(scan.nextLine()); 
      } 
     } 
     }).start(); 

     OutputStream outStream = cmd.getOutputStream(); 
     PrintWriter pWriter = new PrintWriter(outStream); 
     pWriter.println("echo Hello World"); 
     pWriter.flush(); 
     pWriter.close(); 
    } 
} 

そして、あなたは本当にいずれかのエラーストリームを無視するべきではありませんが、代わりに、それは、バッファ領域が不足し得るような、それは時々あなたのプロセスを炒めます無視しているので、それをガツガツ食べる必要があります。

+0

パーフェクト!ありがとうございました。 –

+1

@Hovevercraft:入力ストリームをリスンしようとする前に出力ストリームに書き込もうとしたので、何も見えていないのが理にかなっています。私はコマンドが書かれた後*を読むことがなぜ短い読書につながるのか理解していない。実際、あなたは「何も見ていない」と言っていますが、少なくとも彼は 'cmd.exe'のバナーとプロンプトを見ています。私は彼が再び読むと、彼はそれの残りを見るだろうという印象を持っています。私は何が欠けているのですか? –

6

今日はRuntime.getRuntime().exec()(すべての実用的な目的のため)です。 ProcessBuilderクラスを使用してください。特に、そのstart()メソッドは、stdinおよびstdoutストリームにアクセスするためのメソッドを持つProcessオブジェクトを返します。これらのストリームは、必要に応じてリダイレクトできます。詳細はpostをご覧ください。

関連する問題