Aşağıdaki gibi ProcessBuilder kullanarak Java'da bir süreç oluşturuyorum:
ProcessBuilder pb = new ProcessBuilder()
.command("somecommand", "arg1", "arg2")
.redirectErrorStream(true);
Process p = pb.start();
InputStream stdOut = p.getInputStream();
Şimdi benim sorunum şudur: Bu sürecin stdout ve / veya stderr'inden geçen her şeyi yakalamak ve onu System.out
asenkron olarak yeniden yönlendirmek istiyorum . İşlemin ve çıktı yeniden yönlendirmesinin arka planda çalışmasını istiyorum. Şimdiye kadar, bunu yapmanın tek yolu, sürekli olarak okuyacak stdOut
ve ardından uygun write()
yöntemi çağıracak yeni bir iş parçacığını manuel olarak oluşturmaktı 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();
Bu yaklaşım işe yarasa da biraz kirli geliyor. Üstelik, doğru şekilde yönetip sonlandırmam için bana bir konu daha veriyor. Bunu yapmanın daha iyi bir yolu var mı?
org.apache.commons.io.IOUtils.copy(new ProcessBuilder().command(commandLine) .redirectErrorStream(true).start().getInputStream(), System.out);