Java ProcessBuilder正在最后执行

Java ProcessBuilder正在最后执行,java,file-io,ffmpeg,processbuilder,Java,File Io,Ffmpeg,Processbuilder,我有一段类似这样的代码 File f = new File("Audio/Testing/mbgitr.wav"); try { ProcessBuilder pb = new ProcessBuilder("bash/extractAudio.sh", f.getAbsolutePath()); pb.inheritIO(); pb.start(); }catch(IOException e){ System.ou

我有一段类似这样的代码

File f = new File("Audio/Testing/mbgitr.wav");
    try {
        ProcessBuilder pb = new ProcessBuilder("bash/extractAudio.sh", f.getAbsolutePath());
        pb.inheritIO();
        pb.start();
    }catch(IOException e){
        System.out.println("Oh no!");
    }
    System.out.println(new File("Audio/mbgitr.wav").exists());
bash文件将音频文件转换为不同的格式/采样率,并将其输出到音频文件夹。但无论何时运行此脚本,都会得到以下输出:

/home/Ryan/Development/Java/Test/Audio/Testing/mbgitr.wav
mbgitr.wav
/home/Ryan/Development/Java/Test
false
ffmpeg version 2.6.2 Copyright (c) 2000-2015 the FFmpeg developers
[more ffmpeg output]

Process finished with exit code 0

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

我不知道ProcessBuilder为什么这样做,但这里有一个解决方案。线路

pb.start();
将返回一个进程对象,因此如果该行替换为以下两行

Process p = pb.start();
p.waitFor();
程序将暂停,直到进程完成执行 "

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

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());