다음과 같이 ProcessBuilder를 사용하여 Java로 프로세스를 구축하고 있습니다.
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);