2014-09-04 2 views
3

자식 프로세스가 완료 될 때까지 Java 부모 프로세스를 대기시키는 방법. 나는 runtime.execprocessBuilder.pb으로 시도 :Windows에서 하위 프로세스가 완료되거나 중단되지 않습니다?

String cmd = "ffmpeg -i input.vob output.mp4" 
Runtime rt = Runtime.getRuntime(); 
Process proc = rt.exec(cmd); 
proc.waitFor(); 

이 작은 입력 파일 (예를 들어 10MB 미만)과 함께 작동합니다. 큰 입력 파일을 주면 프로그램이 중단됩니다. 출력 파일이 부분적으로 만들어지고 파일 생성이 중지되고 제어가 반환되지 않습니다. 심지어 proc.join(10000);도 유용한 결과를주지 못했습니다. 여기에서 부모 프로세스는 자식 프로세스 (ffmpeg)가 완료되기 전에 종료됩니다.

이 문제를 극복하는 방법은 무엇입니까?

+0

읽기와 [때 Runtime.exec의()하지 않습니다 (* http://www.javaworld.com/article/2071275/을 모두 * 권고를 구현 core-java/when-runtime-exec --- won-t.html). 그렇다면'exec (..)'를 참조하고'ProcessBuilder'를 사용하여'Process'를 빌드하십시오. 또한'String args'를 공백을 포함하는 인수를 설명하기 위해'String [] args'로 나눕니다. –

답변

3

프로세스가 출력 한 데이터를 읽어야합니다.

프로세스에는 표준 출력과 오류 출력의 두 출력 스트림이 있습니다. 프로세스가 두 출력 모두에 쓸 수 있기 때문에 두 가지를 모두 읽어야합니다.

프로세스의 출력 스트림에는 버퍼가 있습니다. 출력 스트림의 버퍼가 채워지면 프로세스에 의해 추가 데이터를 쓰려고 시도가 차단됩니다.

같은 것을 수행

InputStream in = proc.getInputStream(); // To read process standard output 
InputStream err = proc.getErrorStream(); // To read process error output 

while (proc.isAlive()) { 
    while (in.available() > 0) 
     in.read(); // You might wanna echo it to your console to see progress 

    while (err.available() > 0) 
     err.read(); // You might wanna echo it to your console to see progress 

    Thread.sleep(1); 
}