我做了一个小程序,它运行良好,但现在。首先,它在 mkv 文件中 mux 了 xml 章节文件,所以我们得到了一个 muxed 的 mkv 文件。前几天我将 java 更新到 1.7.21,我认为这就是它现在不工作的原因。这有点奇怪,但是当我在 netbeans 中运行时一切都很好,但是当我构建并运行 .jar 文件时,它不起作用。它会创建 xml 文件,但不会在 mkv 文件中创建 mux(因为没有 muxed,所以不会删除 xml 文件)。下面是代码:(filename=xml文件路径;mkv=mkv文件路径)
public void muxing() {
try {
Runtime rt = Runtime.getRuntime();
Process p = rt.exec("c:\\Program Files\\MKVtoolnix\\mkvpropedit.exe --chapters \""+filename+"\" \""+mkv+"\"");
if (p.waitFor()==0) {
File xmlfile=new File(filename);
xmlfile.delete();
}
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
该程序适用于 java 1.6,我认为也适用于 1.7.17。 Win7 32 位。抱歉我的英语不好。
最佳答案
甲骨文做出了breaking changes到 Java 7 更新 21(和 6 更新 45)中的 Runtime.exec()
。
如果程序名包含空格,则需要在数组中指定命令和参数:
Process p = Runtime.getRuntime().exec(new String[] {
"C:\\Program Files\\MKVtoolnix\\mkvpropedit.exe",
"--chapters", "\""+filename+"\"", "\""+mkv+"\""});
另一种选择是使用 java.lang.ProcessBuilder
:
Process p = new ProcessBuilder("C:\\Program Files\\MKVtoolnix\\mkvpropedit.exe",
"--chapters", "\""+filename+"\"", "\""+mkv+"\"").start();
如 Oracle 所述:
Applications that need to launch programs with spaces in the program name should consider using the variants of
Runtime.exec
that allow the command and arguments to be specified in an array.Alternatively, the preferred way to create operating systems processes since JDK 5.0 is using
java.lang.ProcessBuilder
. The ProcessBuilder class has a much more complete API for setting the environment, working directory and redirecting streams for the process.
关于java - exec 不适用于 java 1.7.21,但在 netbeans 中工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16087745/