ProcessBuilder最后执行

时间:2015-07-08 17:08:10

标签: java file-io ffmpeg processbuilder

我有一段像这样的代码

{{1}}

bash文件将音频文件转换为不同的格式/采样率,并将其输出到Audio文件夹。但每当我运行这个脚本时,我得到以下输出:

{{1}}

似乎测试文件是否存在的代码行是在运行脚本的代码之前执行的。如果我再次运行该程序,它将输出" true"因为该文件已在最后一次迭代中创建。有没有办法让ProcessBuilder调用的文件先执行?提前谢谢!

2 个答案:

答案 0 :(得分:0)

我不确切知道为什么ProcessBuilder会这样做,但这是一个解决方案。这条线

pb.start();

将返回一个Process对象,因此如果该行替换为以下两行

Process p = pb.start();
p.waitFor();

程序将暂停,直到进程完成执行 '

注意:这必须被try / catch块包围,因为p.waitFor()会抛出InterruptedException

答案 1 :(得分:0)

ProcessBuilder.start()将该流程作为单独的流程启动并继续执行。如果您需要等到该进程终止,请修改代码,如下所示。然后你将得到所需的输出。

File f = new File("Audio/Testing/mbgitr.wav");
try {
    ProcessBuilder pb = new ProcessBuilder("bash/extractAudio.sh", f.getAbsolutePath());
    pb.inheritIO();
    Process p = pb.start();  // Get the process
    p.waitFor();    // Wait until it terminates
}catch(IOException e){
    System.out.println("Oh no!");
}catch(InterruptedException e){
    System.out.println("InterruptedException");
}
System.out.println(new File("Audio/mbgitr.wav").exists());