Saya sedang membangun proses di Java menggunakan ProcessBuilder sebagai berikut:
ProcessBuilder pb = new ProcessBuilder()
.command("somecommand", "arg1", "arg2")
.redirectErrorStream(true);
Process p = pb.start();
InputStream stdOut = p.getInputStream();
Sekarang masalah saya adalah sebagai berikut: Saya ingin menangkap apa pun yang terjadi melalui stdout dan / atau stderr dari proses itu dan mengarahkannya ke System.outasynchronous. Saya ingin proses dan pengalihan keluarannya berjalan di latar belakang. Sejauh ini, satu-satunya cara yang saya temukan untuk melakukan ini adalah dengan menelurkan utas baru secara manual yang akan terus membaca stdOutdan kemudian memanggil write()metode yang sesuai dari 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();
Sementara pendekatan semacam itu berhasil, rasanya agak kotor. Dan yang terpenting, ini memberi saya satu utas lagi untuk dikelola dan diakhiri dengan benar. Apakah ada cara yang lebih baik untuk melakukan ini?
org.apache.commons.io.IOUtils.copy(new ProcessBuilder().command(commandLine) .redirectErrorStream(true).start().getInputStream(), System.out);