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