- PR -

Javaからexe実行

1
投稿者投稿内容
未記入
ベテラン
会議室デビュー日: 2007/09/29
投稿数: 78
投稿日時: 2008-07-02 13:23
こんにちは。

JDK 1.5.2
Javaからexeを実行したいのですが、exeファイルの終了も捕まえたいと思っております。

過去の記事で、プロンプトから実行させ、process.waitFor()で終了を
確認するとありましたが、MAXまで行ったら、Java側では次の処理に
スキップする事もあると言われました。
そこで、ReadBufferで確認すれば大丈夫と言われたのですが、そもそも
ReadBufferでwhileで回すと言う事はどういうことでしょうか?

起動したいexeファイル自体に終了ステータスとして、処理終了時にメッセージが
出力されるのですが、ReadBufferは処理の終了ですよね・・?
処理終了の出力パラメータはどのように取得するのでしょうか?
概念がまだ掴めていないのですが・・。

お聞かせいただければ幸いです、よろしくお願いします。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-07-02 14:08
引用:

Javaからexeを実行したいのですが、exeファイルの終了も捕まえたいと思っております。

過去の記事で、プロンプトから実行させ、process.waitFor()で終了を
確認するとありましたが、MAXまで行ったら、Java側では次の処理に
スキップする事もあると言われました。


MAXって何のMAXを差しているのでしょうか・・・

サブプロセスがエラー出力もしくは標準出力へ何かを書き出すと、
Javaのプロセスによって読み出すまでバッファリングされます。
バッファが一杯になると書き出す側が書けなくなり、
バッファが空くまで書き出しがブロックされます。

つまりサブプロセスはバッファに書き出せるまで、
終了しない状態になります。

Javaのプロセスがバッファからの読み出しを行わずに、
Process#waitFor()を呼び出してしまった場合、
バッファへの書き出しでブロックしているサブプロセスの終了を、
待ち続けている状態になります。これをデッドロックといいます。

したがって、サブプロセスの標準出力とエラー出力のバッファが、
常に空いているような状態になるようにプログラムを書く必要が有ります。
そこで、Process#getErrorStream()とProcess#getOutputStream()で、
サブプロセスの出力から読み出す必要が有ります。

この説明は、APIドキュメントに書いてありますので、
熟読された方がよいかと思います。

引用:

起動したいexeファイル自体に終了ステータスとして、処理終了時にメッセージが
出力されるのですが、ReadBufferは処理の終了ですよね・・?
処理終了の出力パラメータはどのように取得するのでしょうか?
概念がまだ掴めていないのですが・・。


メッセージとはなんでしょうか。
標準出力に終了を示すメッセージを出力しているということでしょうか。
それならサブプロセスの標準出力から読み出せばよいのではないでしょうか。
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2008-07-02 14:23
引用:

かつのりさんの書き込み (2008-07-02 14:08) より:
したがって、サブプロセスの標準出力とエラー出力のバッファが、
常に空いているような状態になるようにプログラムを書く必要が有ります。
そこで、Process#getErrorStream()とProcess#getOutputStream()で、
サブプロセスの出力から読み出す必要が有ります。



サンプルをどうぞ。当然、"Listing 4.5 GoodWindowsExec.java"です。
http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=3
未記入
ベテラン
会議室デビュー日: 2007/09/29
投稿数: 78
投稿日時: 2008-07-04 21:20
返信が遅れて申し訳ありません。

ご紹介いただきありがとうございます。
実現できました。

また、かつのりさんの説明でよく分かりました。
丁寧にありがとうございました。

また、色々質問すると思いますが、よろしくお願いします。
1

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