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()抛出InterruptedExceptionProcessBuilder。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());