JavaのProcessBuilderについて質問です。

ProcessBuilderでバッチファイルを起動し、そのバッチファイルが標準出力に出力した内容をJavaで読み取りたいのですがうまくいきません。
コマンドと引数を出力した行は取得できるのですが、肝心の処理結果の出力行が取得できません。
プログラムに間違いがあるのでしょうか?アドバイスお願いします。

■バッチファイル
java -version

■Java
ProcessBuilder pb = new ProcessBuilder("C:\\test.bat");
Process p = pb.start();
p.waitFor();
InputStream is = p.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
try {
for (;;) {
String line = br.readLine();
if (line == null)
break;
System.out.println(line);
}
} finally {
br.close();
}

■実行結果
C:\>java -version

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2011/04/19 00:58:28
  • 終了:2011/04/20 21:27:29

回答(3件)

id:a-kuma3 No.1

a-kuma3回答回数4487ベストアンサー獲得回数18562011/04/19 01:37:15

ポイント27pt

Process の waitFor() って、要らないんじゃないかな。

id:Gaasu

回答ありがとうございます。

2011/04/20 21:25:25
id:nattow No.2

nattow回答回数102ベストアンサー獲得回数272011/04/19 10:22:28

ポイント27pt

java -version の場合、出力結果は標準出力ではなくエラー出力に吐き出されます。

ですので、getInputStream() ではなく getErrorStream() を使うと処理結果が取得できます。

ちなみに処理方法は getInputStream() と同様です。

id:Gaasu

回答ありがとうございます。

標準エラー出力だとは思いませんでした。

2011/04/20 21:26:56
id:nattow No.3

nattow回答回数102ベストアンサー獲得回数272011/04/20 13:22:25

ポイント27pt

標準出力と標準エラー出力を混在させてもよいのなら、ProcessBuilder#redirectErrorStream を使ってもよいです。

以下のように一行追加するだけで済みます。

>|java|

ProcessBuilder pb = new ProcessBuilder("C:\\test.bat");

pb.redirectErrorStream(true);

Process p = pb.start();

...

||<

id:Gaasu

回答ありがとうございます。

こういう方法もあるんですね。勉強になります。

2011/04/20 21:27:14

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません