2012-04-04 16 views
0

これは私のコードは、Javaを介してWindowsでプロセスを開始する(と出力をうんざりする)です。どういうわけかruntime.execすぐにEOFを入力して送信しますか?

public static void main(String[] args) throws Exception { 
    String[] command = new String[3]; 
    command[0] = "cmd"; 
    command[1] = "/C"; 
    command[2] = "test.exe"; 
    final Process child = Runtime.getRuntime().exec(command); 
    new StreamGobbler(child.getInputStream(), "out").start(); 
    new StreamGobbler(child.getErrorStream(), "err").start(); 
    BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
      child.getOutputStream())); 
    out.write("exit\r\n"); 
    out.flush(); 
    child.waitFor(); 
} 

private static class StreamGobbler extends Thread { 
    private final InputStream inputStream; 
    private final String name; 

    public StreamGobbler(InputStream inputStream, String name) { 
     this.inputStream = inputStream; 
     this.name = name; 
    } 

    public void run() { 
     try { 
      BufferedReader in = new BufferedReader(new InputStreamReader(
        inputStream)); 
      for (String s = in.readLine(); s != null; s = in.readLine()) { 
       System.out.println(name + ": " + s); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

質問(プロセス)のプログラムが(私は「実行」行PASステップの後に右のように)すぐにEOFが供給ので、実行時の直後にエラー(検出され、無効な)メッセージを投げています。 execが呼び出されます。私はこの問題を起こさずにコマンドプロンプトでこのプログラムを手動で実行することができますが、Windows上でctrl-zを送信することがこのメッセージの原因であることを確認しました。

誰でもこの原因が分かりますか?

問題がある場合は、cmd/c test.exeの代わりに直接 "test.exe"としてプロセスを実行しようとしましたが、そのときにinputStream経由で出力が見えません。/cを付けずにcmd.exeを実行すると、違いはありません。

答えて

1

コードが正しく動作するように見えます(警告が1つあります、以下を参照)。

あなたのコードをそのまま受け取り、test.extsortに置き換えました。これはパイプ標準入力から読み取ることができます。

コードをそのまま実行すると、入力を待つsortコマンドが開始されます。出力ストリームを閉じてEOFを示していないため、child.waitFor()にハングします。 close()コールを追加すると、すべて正常に動作します。

あなたはtest.exeを見て、それがパイプ入力から読み込むことができるか、コンソール入力を期待しているかどうかを判断することをお勧めします。

+0

ジムありがとう、それは私が必要としていたものです。プログラムがsortや他のcmdの行ユーティリティのようにstdinを処理しないように見えます。 – user1309154

0

"cmd"と "/ c"を削除します。現在は、test.exeではなくcmd.exeに出力を供給しています。

+0

問題は、私があなたの言うことをすると、何とか私は今、私が記事の最後に述べたように、InputStream経由でプログラムから何の標準出力も受け取っていないということです。なぜそうかもしれないか知っていますか?私はcmd/cを使用しています。これは、この特定のコマンドラインツール以外のすべてのコマンドラインツールで動作するためです。 – user1309154

+0

@ user1309154 Jim Garrisonの答えを参照してください。 'waitFor()'を呼び出す前に必ず出力ストリームを閉じる必要があります。 – EJP

関連する問題