次のように、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つあります。これを行うより良い方法はありますか?
org.apache.commons.io.IOUtils.copy(new ProcessBuilder().command(commandLine) .redirectErrorStream(true).start().getInputStream(), System.out);