2012-04-03 19 views
2

外部プロセスを実行するためにJavaのapache execクラスを使用する簡単なコードがいくつかあります。特定のコマンドラインプログラムの場合WindowsのJavaプロセスからのコマンドライン出力がありません

Executor ex = new DefaultExecutor(); 
    ex.setStreamHandler(new PumpStreamHandler(System.out, System.out, System.in)); 
    CommandLine cl = new CommandLine(
    "C:\\program.exe"); 

    ex.execute(cl); 

}

、これは期待通りに動作し、ストリーム「の」に自分のテキストを受け入れながら、「アウト」の流れの中に、すべてのプログラムの出力を取得します。しかし、他のプログラムでは、プロセスの出力がコマンドラインから手動で表示されますが、javaプロセスを経由して実行すると何も入力されません。

私は最終的にstdinに書き出し、コード内でstdoutを取り出して分析したいと考えています。

私にはわからない理由がある場合、なぜいくつかのプログラムはコマンドラインでテキストを出力するようですが、私はそれらをJavaプロセスとして実行するとストリームから何も受け取らないのですか?

これはWindowsで発生しています。

+0

多分あなたはこの質問からの問題があります:http://stackoverflow.com/questions/27249101/windows-prevents-stdout-from-external-command-line-executions-to-be-redirected-t – radio

答えて

0

アウトプロセスコードは、明示的に構成しない限り、同じコマンドライン出力には移動しません。また、一般的な規則として、println文を実行するよりもlog4jのようなロギングライブラリを使用する方がよいでしょう。

+0

私は最終的にプロセスstdinに書き込んで、自分のjavaコード内でstdoutから読み込み、プロンプトで人間を模倣できるようにします。この制限は可能ですか? – user1309154

+0

できますが、迷惑です。 ProcessクラスのgetOutputStream/getInputStreamを使用して構成します。しかし、私が読んだことは、外部プロセス自体の内部でそれを行うと、デッドロックが発生する可能性があるということです。回避策があります(明らかに別のプロセスで設定を行うことができます)。あるいは、ProcessBuilderを使用してI/Oストリームをリダイレクトすることができます:http://stackoverflow.com/questions/3643939/java-process-with-input-output-stream – smcg

+0

私は誤解の可能性があります。しかし私のコードでは、System.outとStreamsをPumpStreamHandlerコンストラクタに渡しています。これはApacheのexecクラスで、このストリームは内部的にストリームを行います。私の質問は、ダミープログラムを含むいくつかの外部プログラムでは自分自身を書くことができますが、すべての出力を正常に取り出すことができますが、Windowsのcmdラインでは出力が正しくても、 – user1309154

関連する問題