Tôi đang xây dựng một quy trình trong Java bằng ProcessBuilder như sau:
ProcessBuilder pb = new ProcessBuilder()
.command("somecommand", "arg1", "arg2")
.redirectErrorStream(true);
Process p = pb.start();
InputStream stdOut = p.getInputStream();
Bây giờ vấn đề của tôi là như sau: Tôi muốn nắm bắt bất cứ điều gì đang diễn ra qua stdout và / hoặc stderr của quá trình đó và chuyển hướng nó đến System.out
không đồng bộ. Tôi muốn quá trình và chuyển hướng đầu ra của nó chạy trong nền. Cho đến nay, cách duy nhất tôi tìm thấy để làm điều này là tạo ra một chuỗi mới theo cách thủ công sẽ liên tục đọc từ stdOut
đó và sau đó gọi write()
phương thức thích hợp của 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();
Trong khi cách tiếp cận đó hoạt động, nó có cảm giác hơi bẩn. Và trên hết, nó cung cấp cho tôi thêm một chuỗi để quản lý và kết thúc một cách chính xác. Có cách nào tốt hơn để làm điều này không?
org.apache.commons.io.IOUtils.copy(new ProcessBuilder().command(commandLine) .redirectErrorStream(true).start().getInputStream(), System.out);