- ベストアンサー
execでdirコマンドを実行すると停止します
- javaのプログラム内でdirコマンドを実行すると、特定のオプションを付けると動作が停止する問題が発生しています。
- オプションを付けない場合には問題なく進行することから、問題はオプションに関連している可能性があります。
- ファイルの探索に時間がかかっているわけではなく、完全に動作が停止しているため、原因を特定する必要があります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> stdoutがブロックしているというのがよくわからないのですが > どういう状態なのでしょうか 子プロセス(このケースでは cmd /c dir)の標準出力(stdout)を読込むバッファーが満杯になり、Java側の読込みを待っている状態です。 Process の各 InputStream の読込みを行わないと、このように標準出力または標準エラー出力ブロックしてしまうことが有ります。 ↓の「ネイティブなプラットフォームには・・・」の部分を参照して下さい。 http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/Process.html また、バッファーサイズは個々のJVMの実装によると思いますが、かなり小さいことが多いようです。 標準出力/標準エラー出力それぞれの読込みスレッドを作って読込ませることなどで一応の解決はできます。 下記のページも参考になるかと。 http://www.ne.jp/asahi/hishidama/home/tech/java/process.html#h4_NG_after http://blog.livedoor.jp/applepedlar/archives/51979434.html http://isolinear.info/wiki/index.php/Java/Tips/Java%A4%C7%A1%A4%BB%D2%A5%D7%A5%ED%A5%BB%A5%B9%A4%F2%BB%C8%A4%A6%A4%C8%A4%AD%A4%CE%C3%ED%B0%D5%C5%C0.html
その他の回答 (1)
- osamuy
- ベストアンサー率42% (1231/2878)
stdoutがブロックしているからでは。 command = "cmd /c dir *.java /a-d/s >NUL"; ――で正常終了するか試してみるとか。
補足
そのように書き換えるとwaitfor()は通過しました。(出力がなくなるのでプログラムの別の所で止まりますが) stdoutがブロックしているというのがよくわからないのですがどういう状態なのでしょうか
お礼
丁寧な解説ありがとうございます。 一度ファイルに書き出すことにしようと思います。