こんにちは私はJavaプログラムから外部プログラムを実行in real time
し、プログラムが終了するのを待たずにstdoutメッセージを読み込もうとしています。ただし、.exeプログラムごとに異なるstdoutの動作があることがわかり、その処理方法がわかりません。
例1:
server1.exeはコンソールプログラムです。実行すると、ポートで継続的にリッスンします。クライアントが接続されると、stdout
1秒ごとに1行の出力が生成されます。「ctrl-C」を押さないと終了しません。
コマンドプロンプトで、次のコマンドを実行します。
server1.exe > stdout.out 2> stderr.err
クライアントがそれに接続されているとき、私はそれstdout.out file
がリアルタイムで更新されることを発見しました。server1.exeはまだ実行中ですがstdout.out file
、stdout出力をリアルタイムで開いて読み取ることができます。
例2:
server1.exeと同様に、server2.exeもコンソールプログラムです。実行すると、ポートで継続的にリッスンします。クライアントが接続されると、1秒ごとに1行のstdout出力が生成されます。「ctrl-C」を押さないと終了しません。
コマンドプロンプトで、次のコマンドを実行します。
server2.exe > stdout.out 2> stderr.err
stdout.out file
クライアントがserver2.exeに接続していても、空であることがわかりました。server2.exeがまだ実行されている限り、stdoutはに書き込まれませんstdout.out file
。そのファイルはで更新されませんreal time
。を押すctrl-C
と、突然多くの出力行がに書き込まれstdout.out file
ます。
私がt=11で押すと仮定するとctrl-C
、t=1からt=11までのすべてのstdout出力がに書き込まれますstdout.out file
。この前のt=10では、stdout.out
ファイルは空です。
例2のプログラムでread the stdout in real time
は、Javaプログラムを使用できないため、問題が発生しています。私のJavaプログラムは次のとおりです。
process = Runtime.getRuntime().exec(command);
input = new BufferedReader(new InputStreamReader(process.getInputStream()));
String inputtext = null;
while ((inputtext = input.readLine()) != null)
{
//print out the text in Real Time, when the .exe program is still running
}
stdout output
を押さないと、例2のプログラムが生成されない理由を教えてくださいctrl-C
。
奇妙なことに、コンソールウィンドウでそのプログラムを手動で実行すると、1秒ごとにコンソールウィンドウにstdout出力が出力されます。inputtext = input.readLine()
しかし、を使用してJavaから読み取ろうとすると、プログラムがまだ実行されている限り長くinputtext
なりますnull
(入力テキストを出力してテストしました)。を押すctrl-C
と、BufferedReaderが突然すべての保留中のstdout出力でいっぱいになります。
stdout
server2.exeをリアルタイムで読み取るにはどうすればよいですか?