2012-03-28 12 views
0

外部プロセスを実行するJavaコードを書き留める必要があります。 このプロセスはstdinから入力行を取得し、stdoutに出力行を与えます。Javaの実行中にbashコマンドを入力して出力しているとき

try 
{    
    Runtime rt = Runtime.getRuntime(); 
    Process proc = rt.exec("./" + args[0]); 
    Process proc2 = rt.exec(c); 
    int exitVal = proc2.exitValue(); 
    System.out.println("Process exitValue: " + exitVal); 
} 
catch (Throwable t){ 
} 

を次のように引数[0]外部プロセスであり、cは私がプロセスに供給する必要が入力(文字列)である場合

Iが書いたコードです。それが正しく実行されていた場合、私はexitVal = 0を取得し、代わりに何も取得しません。また、私が実際に印刷したいのは、外部プロセスの出力です(この例では "6"になります)。

+0

'キャッチ(Throwableをトン){}' ...ということを決してしないhttp://www.javapractices.com/topic/TopicAction .do?Id = 16 – artbristol

答えて

0

"何も取得できません"。メソッドexitValue()はプリミティブ型を返すため、nullにすることもできません。しかし、この方法は固まってしまいます。これは、プロセスがまだ実行中であるために発生します。

「フィードしていない」ため実行されている可能性がありますか?この場合は、proc2.getOutputStream()に電話し、必要なものをこのストリームに書き込むだけです。プロセスの出力を読み取る場合は、proc2.getInputStream()を使用し、ストリームから読み取ります。

詳しくはProcessBuilderをご覧ください。それはより簡単でより良い、よりオブジェクト指向のAPIを提供しますRuntime.exec()

+0

あなたの返信ありがとうございます! ProcessBuilderを使用してもまだ成功していません:/問題は変わりません...実行可能ファイルの動作は次のとおりです:実行して(Enter)、文字列を待つ(文字列を入力する→Enter)私は、このプロセスにスタンダードを待っていることを知らせる方法が必要です。 –

2

通信にはgetInputStream()getOutputStream()を使用する必要があります(javadocsを参照)。

プロセスからすべてのデータを読み取らないと、プロセスがハングアップしてデッドロックする可能性があります。一般的な問題の簡単な紹介については、this blog postを参照してください。少なくとも、プロセス出力からすべてのデータを読み取る必要があります。

0

あなたは '<' リダイレクトとプログラム入力を養うことができます。

{ 
    Process p = Runtime.getRuntime().exec("wc < pom.xml"); 
    p.waitFor(); 
    System.out.println(p.exitValue()); 
    BufferedReader bri = new BufferedReader 
    (new InputStreamReader(p.getInputStream())); 
    String line; 
    while ((line = bri.readLine()) != null) { 
    System.out.println(line); 
    } 
    bri.close(); 
} 
+0

お返事ありがとうございます!私は実行可能ファイルに文字列を供給したくないということです。 –

+1

[こちら](http://www.rgagnon.com/javadetails/java-0014.html) – wytten

関連する問題