次のコマンドを使用して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コードが期待どおりに動作しないのか、あなたは説明することができます、なぜ全く同じコマンドがコマンドラインから機能するのでしょうか?
ありがとうございます。
開始しようとしているファイルが見つからないことが原因でエラーコードが発生している可能性があります。パスを相対パスではなく絶対パスに変更してください。または、あなたが期待するディレクトリで起動しないため、コマンドの引数が見つからないためです。 – MTilsted