我做了一个小程序,它工作正常,但现在。首先,它将mkv文件中的xml章节文件复用,因此我们获得了一个muxed mkv文件。前一天我将java更新为1.7.21,我认为这就是为什么它现在不能正常工作的问题。这有点奇怪,但是当我在netbeans中运行时一切都很好,但是当我构建并运行.jar文件时,它无效。它创建了xml文件,但mkv文件中没有mux(因为没有多路复用而不删除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 32bit。抱歉我的英语不好。
答案 0 :(得分:3)
Oracle在Java 7更新21(以及6更新45)中将breaking changes发送到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所述:
需要在程序名称中启动带空格的程序的应用程序应考虑使用允许在数组中指定命令和参数的
Runtime.exec
变体。或者,自JDK 5.0以来创建操作系统进程的首选方法是使用
java.lang.ProcessBuilder
。 ProcessBuilder类有一个更完整的API,用于设置环境,工作目录和重定向流的流。