Я создаю процесс на 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);