- - PR -
外部起動されたプログラムから標準出力に出力したい
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-08-04 17:43
お世話になります。
現在、外部コマンドで起動したプログラムから標準出力に出力できず困っています。 Aプログラムから、 process = runtime.exec("java xxx"); でBプログラムを起動しています。 Aプログラムは、Bプログラムが終了するまで待たずに、次の処理を行います。 その間Bプログラムは、Bプログラム固有の処理を行うのですが、その際に標準出力に何も出力されません。 Aプログラムで下のようにしてしまうとBプログラムが終了するまで待ってしまいます。 // 呼び出したプログラムの出力を標準出力に送る BufferedReader br = new BufferedReader( new InputStreamReader( process.getInputStream() ) ); String line; while( (line = br.readLine()) != null ) System.out.println( line ); Aプログラム、Bプログラムは別々にログファイルを出力するので、 log4jでそれぞれ別のappenderを使用しています。 Bプログラムの方で2多重のスレッド処理を行います。 スレッドは2つまでという制約がついてます。 なので、Bプログラムを外部コマンドで起動しています。 BをAから起動せず、単体で起動いた場合にはコンソールにメッセージは出力されます。 BがAから起動されてもコンソールに出力されるようにしたいのですが、その方法わかりません。 何か良い方法があれば是非教えて下さい。 どうかよろしくお願い致します。 [ メッセージ編集済み 編集者: K5 編集日時 2006-08-04 18:05 ] [ メッセージ編集済み 編集者: K5 編集日時 2006-08-05 19:19 ] | ||||
|
投稿日時: 2006-08-04 17:53
スレッドに分けたらどうでしょう。
| ||||
|
投稿日時: 2006-08-04 18:05
すいません。書き忘れました。 Bプログラムの方で2多重のスレッド処理を行います。 スレッドは2つまでという制約がついてます。 なので、Bプログラムを外部コマンドで起動しています。 | ||||
|
投稿日時: 2006-08-04 20:22
OSは何でしょう?
>while( (line = br.readLine()) != null ) Bの標準出力をAで読むのなら br.readLine()がnullを検出(EOF)となるのは、 Bの標準出力が閉じられた時点となるでしょう。 A側で読んだ内容を見て、brのnull検出を待たず、whileを抜けるといった 仕様でしょうか? それ以前に、Bが出力してるのに、A側で読めないのでしょうか? それならBで標準出力をflush()したらどうでしょう? | ||||
|
投稿日時: 2006-08-04 21:02
開発環境はwinXPです。 AとBが同時に動く事になりますが、AはAで標準出力に表示する、BはBで標準出力に表示する。 とするような事、もしくはそのように見せることをしたいと考えています。 (そのときに、Aの処理が止まることがないようにしたい) よろしくお願い致します。 [ メッセージ編集済み 編集者: K5 編集日時 2006-08-04 21:28 ] | ||||
|
投稿日時: 2006-08-05 07:19
A、B共にコンソールアペンダーに出力するというのはだめでしょうか。 A側でBが出力した内容を制御する必要がある場合は使えない手だと は思いますが。 | ||||
|
投稿日時: 2006-08-05 15:27
A,B共にコンソールアペンダーを使用していますが、Aはコンソールに出力されるのですが、Bはコンソールに出力されません。 BをAから起動せず、単体で起動いた場合にはコンソールにメッセージは出力されます。 BがAから起動されてもコンソールに出力されるようにしたいのですが、その方法わかりません。 何か良い方法があれば是非教えて下さい。 よろしくお願い致します。 [ メッセージ編集済み 編集者: K5 編集日時 2006-08-05 15:56 ] | ||||
|
投稿日時: 2006-08-10 16:35
Windowsならば、STARTコマンドとバッチファイルを組み合わせる事で出来ると思います。ただし、それぞれ独立したコンソールをAとBが持ちます。
次のような形です。 ■Javaソース(A) Runtime.getRuntime().exec("cmd /K start c:\\\\test\\\\exec.cmd"); ■バッチファイル(c:\\test\\exec.cmd) java -cp .;\\source\\java test.B |
1