ProcessBuilder 最后执行

ProcessBuilder is executing last

我有一段代码是这样的

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 文件将音频文件转换为不同的 format/sample 速率并将其输出到文件夹 Audio。但是每当我 运行 这个脚本时,我都会得到以下输出:

/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

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

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

pb.start();

将return一个Process对象,所以如果那一行被下面两行替换

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

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

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

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

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