如何让我的java父进程等到子进程完成。我尝试使用runtime.exec
和processBuilder.pb
:
String cmd = "ffmpeg -i input.vob output.mp4"
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(cmd);
proc.waitFor();
这适用于小输入文件(比如小于10 Mb)。如果我提供更大的输入文件,那么程序将被挂起。输出文件将被部分创建,文件创建将被挂起,控件将不会返回。即使proc.join(10000);
也没有给出任何有用的结果。这里父进程在子进程(ffmpeg)完成之前终止。
如何克服这个问题?
答案 0 :(得分:3)
您需要读取该过程输出的数据。
进程有2个输出流:标准输出和错误输出。您必须同时读取这两个,因为该过程可能会写入这两个输出。
进程的输出流有缓冲区。如果输出流的缓冲区已满,则尝试将进一步的数据写入该进程被阻止。
做这样的事情:
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);
}