ฉันกำลังสร้างกระบวนการใน Java โดยใช้ ProcessBuilder ดังนี้:
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();
แม้ว่าวิธีการทำงานแบบนั้นจะรู้สึกสกปรกเล็กน้อย และยิ่งไปกว่านั้นมันทำให้ฉันมีอีกหนึ่งเธรดในการจัดการและยุติอย่างถูกต้อง มีวิธีไหนที่ดีกว่านี้ไหม?
org.apache.commons.io.IOUtils.copy(new ProcessBuilder().command(commandLine) .redirectErrorStream(true).start().getInputStream(), System.out);