Buduję proces w Javie przy użyciu ProcessBuilder w następujący sposób:
ProcessBuilder pb = new ProcessBuilder()
.command("somecommand", "arg1", "arg2")
.redirectErrorStream(true);
Process p = pb.start();
InputStream stdOut = p.getInputStream();
Teraz mój problem jest następujący: chciałbym przechwycić wszystko, co przechodzi przez standardowe wyjście i / lub stderr tego procesu i przekierować to na System.out
asynchronicznie. Chcę, aby proces i jego przekierowanie wyjścia działały w tle. Jak dotąd, jedynym sposobem, w jaki udało mi się to zrobić, jest ręczne utworzenie nowego wątku, który będzie w sposób ciągły odczytywał, stdOut
a następnie wywoływał odpowiednią write()
metodę 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();
Chociaż takie podejście działa, wydaje się trochę brudne. A do tego daje mi jeszcze jeden wątek do prawidłowego zarządzania i zakończenia. Czy jest lepszy sposób, aby to zrobić?
org.apache.commons.io.IOUtils.copy(new ProcessBuilder().command(commandLine) .redirectErrorStream(true).start().getInputStream(), System.out);