- PR -

外部コマンドの標準出力の取得

1
投稿者投稿内容
finch
常連さん
会議室デビュー日: 2006/09/29
投稿数: 26
投稿日時: 2006-10-20 15:44
 外部コマンドの標準出力の内容を得るには、以下のようなコーディングが考えられます。

コード:
String command = "ls -l";
Process process = Runtime.getRuntime().exec(command);
InputStream is = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = br.readLine()) != null) {
    // line で何かする。
}


 このコーディングでですが、外部コマンドの動作が遅れた場合でも、標準出力の内容を全部取得できるものでしょうか?
 process.waitFor()で待てば大丈夫なんでしょうが、標準出力の量が多いとバッファが満杯になり、process.waitFor()の前にバッファを読み出す処理が必要になるようです。
(バッファを空けないと、外部コマンドの処理が止まってしまう)
 このあたりについてご存知の方がいらっしゃいましたら、教示お願い致します。
想馬
大ベテラン
会議室デビュー日: 2003/05/29
投稿数: 245
お住まい・勤務地: 神奈川・東京
投稿日時: 2006-10-20 15:56
私は力不足のため答えることが出来ませんが、このスレッドが参考になるかもしれないのでリンクしておきます。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=27593&forum=12&0
_________________
己への戒め

「活動的な馬鹿より恐ろしいものはない」 by ゲーテ
finch
常連さん
会議室デビュー日: 2006/09/29
投稿数: 26
投稿日時: 2006-10-20 17:00
 自己レスになりますが、HP-UX 11i,JDK5.0で、検証してみました。
 その結果ですが、プロセスが終了するまで、br.readLine()で待っていました。
(標準エラー出力の取得でも同様です)
 ですので、外部コマンドが出力する内容は、process.waitFor()で同期を取らなくても、すべて取得できるものと考えられます。
(外部コマンドから標準出力と標準エラー出力の両方に出力するケースが無い限り、複雑な制御を行う必要は無いものと想います)
finch
常連さん
会議室デビュー日: 2006/09/29
投稿数: 26
投稿日時: 2006-10-20 19:14
 また自己レスになりますが、ProcessBuilderにより、標準エラー出力を標準出力にマージする事が可能でした。
 ですから、標準エラー出力と標準出力をそれぞれ別々に見る必要が無い限り、マージする事により、(別スレッドから読み出しを行うような)複雑な制御を行わないで済むと考えられます。
1

スキルアップ/キャリアアップ(JOB@IT)