次のように、ProcessBuilder を使用して Java でプロセスを構築しています。
ProcessBuilder pb = new ProcessBuilder()
.command("somecommand", "arg1", "arg2")
.redirectErrorStream(true);
Process p = pb.start();
InputStream stdOut = p.getInputStream();
今私の問題は次のとおりです。そのプロセスの stdout および/または stderr を通過するものをすべてキャプチャし、System.out
非同期にリダイレクトしたいと考えています。プロセスとその出力リダイレクトをバックグラウンドで実行したい。これまでのところ、これを行う唯一の方法は、から継続的に読み取り、適切なメソッドをstdOut
呼び出す新しいスレッドを手動で生成することです。write()
System.out
new Thread(new Runnable(){
public void run(){
byte[] buffer = new byte[8192];
int len = -1;
while((len = stdOut.read(buffer)) > 0){
System.out.write(buffer, 0, len);
}
}
}).start();
そのようなアプローチは機能しますが、少し汚れているように感じます。それに加えて、正しく管理して終了するためのスレッドがもう 1 つ増えます。これを行うより良い方法はありますか?