- PR -

外部起動されたプログラムから標準出力に出力したい

1
投稿者投稿内容
K5
常連さん
会議室デビュー日: 2006/04/22
投稿数: 25
投稿日時: 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 ]
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-08-04 17:53
スレッドに分けたらどうでしょう。
K5
常連さん
会議室デビュー日: 2006/04/22
投稿数: 25
投稿日時: 2006-08-04 18:05
引用:

mioさんの書き込み (2006-08-04 17:53) より:
スレッドに分けたらどうでしょう。



すいません。書き忘れました。
Bプログラムの方で2多重のスレッド処理を行います。
スレッドは2つまでという制約がついてます。
なので、Bプログラムを外部コマンドで起動しています。
progman
大ベテラン
会議室デビュー日: 2005/06/08
投稿数: 227
投稿日時: 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()したらどうでしょう?



K5
常連さん
会議室デビュー日: 2006/04/22
投稿数: 25
投稿日時: 2006-08-04 21:02
引用:

progmanさんの書き込み (2006-08-04 20:22) より:
OSは何でしょう?


開発環境はwinXPです。

AとBが同時に動く事になりますが、AはAで標準出力に表示する、BはBで標準出力に表示する。
とするような事、もしくはそのように見せることをしたいと考えています。
(そのときに、Aの処理が止まることがないようにしたい)
よろしくお願い致します。


[ メッセージ編集済み 編集者: K5 編集日時 2006-08-04 21:28 ]
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2006-08-05 07:19
引用:

log4jでそれぞれ別のappenderを使用しています


A、B共にコンソールアペンダーに出力するというのはだめでしょうか。
A側でBが出力した内容を制御する必要がある場合は使えない手だと
は思いますが。
K5
常連さん
会議室デビュー日: 2006/04/22
投稿数: 25
投稿日時: 2006-08-05 15:27
引用:

A、B共にコンソールアペンダーに出力するというのはだめでしょうか。
A側でBが出力した内容を制御する必要がある場合は使えない手だと
は思いますが。



A,B共にコンソールアペンダーを使用していますが、Aはコンソールに出力されるのですが、Bはコンソールに出力されません。

BをAから起動せず、単体で起動いた場合にはコンソールにメッセージは出力されます。
BがAから起動されてもコンソールに出力されるようにしたいのですが、その方法わかりません。
何か良い方法があれば是非教えて下さい。
よろしくお願い致します。




[ メッセージ編集済み 編集者: K5 編集日時 2006-08-05 15:56 ]
茶葉
会議室デビュー日: 2002/12/28
投稿数: 10
投稿日時: 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

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