2016-04-27 16 views
0

次のコマンドを使用してJavaからコンパイル済みのCプログラムを実行しようとしています。次に、プロセスの入力ストリームから結果を取得したい。Javaからコマンドラインを実行する際の問題

Process p = Runtime.getRuntime().exec(commandLine); 

さて、私のコマンドはこれです(最初の文字列は、プログラムへのパス第2、第3のあるプログラムはのparamsとして取るファイルへのパスです):

trec_eval.8.1\trec_eval.exe trec_eval.8.1\czech TREC\results_2016-04-26_20_52_175.txt 

私は、コマンドから正常にそれを実行すると、 (私はWindows 10で)、それは期待どおりに動作します(Cプログラムはエラーなしで終了し、期待される出力をコマンドラインに出力します)。残念ながら、Javaから実行すると動作しません。プロセスのstdoutストリームとstderrストリームは両方とも空であり、プロセスの終了ステータスは何らかのエラーコードです。ここで

は例を(それは、このコードスニペットがあまりにも長く以来、私は、標準エラー出力ストリームを省略)「作業」最小限です:

明らか
Command: trec_eval.8.1\trec_eval.exe trec_eval.8.1\czech TREC\results_2016-04-27_18_27_585.txt 
Output: 
Exit status: -1073741515 

:このコードから

String commandLine = "trec_eval.8.1\\trec_eval.exe" + 
      " trec_eval.8.1\\czech + " " + file; 
System.out.println("Command: " + commandLine); 

Process process = Runtime.getRuntime().exec(commandLine); 
BufferedReader stdout = new BufferedReader(new InputStreamReader(process.getInputStream())); 

StringBuilder output = new StringBuilder("Output:\n"); 
for (String line; (line = stdout.readLine()) != null;) { 
     output.append(line).append("\n"); 
} 
System.out.println(output.toString()); 

int exitStatus = 0; 
try { 
    exitStatus = process.waitFor(); 
} catch (InterruptedException ie) { 
    ie.printStackTrace(); 
} 
System.out.println("Exit status: " + exitStatus); 
stdout.close(); 

出力はラインを以下の通りです私はStackoverflowや他の場所でいくつかの他の答えを読んできました。残念ながら、答えのコードは私のものとほとんど同じでした(私のコードが動作しないのと同じ方法で私のために働かなかった)。

誰かが私に間違っていると教えてもらえますか?なぜCプログラムの出力を含むのではなく、stdoutストリームが空ですか?プロセスがステータス0(終了する必要がある)で終了しないのはなぜですか?しかし、前述の奇形はありますか?最後に、あなたが知っている、なぜ私のJavaコードが期待どおりに動作しないのか、あなたは説明することができます、なぜ全く同じコマンドがコマンドラインから機能するのでしょうか?

ありがとうございます。

+0

開始しようとしているファイルが見つからないことが原因でエラーコードが発生している可能性があります。パスを相対パスではなく絶対パスに変更してください。または、あなたが期待するディレクトリで起動しないため、コマンドの引数が見つからないためです。 – MTilsted

答えて

0

プログラムが環境に必要なものを手に入れていないようです。あなたは、プログラムがエラーコードで終了したので、あなたのJavaコードのように聞こえるようにしてください(プログラムの起動と終了コードの読み込み)。

あなたのパスは相対的です - おそらくJavaはあなたが思っているディレクトリから始まっていないでしょうか?あなたの議論へのフルパスを試み、それが役立つかどうかを見てください。

アプリからのエラーコードを解釈する方法はありますか?

それ以外の場合は、完全パスを使用してシェル(OSによってはcmd/cまたはsh)を実行してみてください。あなたはjavaなしでそれをテストすることができますし、javaにすべてを渡して、同じ結果を得るかどうかを確認してください。

+0

絶対パスで実行すると、結果はまったく同じです.Javaでは同じエラーコード、コマンドラインでは正しい結果が得られます。 – awa993

+0

Javaから直接「cmd」または「sh」を呼び出し、アプリをパラメータとして渡すのはどうですか? (あなたはそれがJavaかあなたのCアプリかどうかを判断するために単に "エコー"を実行することと比較することができます) –

関連する問題