我对此代码有疑问:
try {
String cmd = "C:\\Program Files\\MySQL\\MySQL Server 5.5\\bin\\mysqldump.exe -uroot -proot foo_db -rC:\\backup.sql";
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(cmd);
} catch(Exception e) {}
它没有任何错误,实际上它没有做任何事情:没有备份和没有执行cmd。问题出在哪里?
这很奇怪,因为cmd文本是正确的...我试图用Windows中的“执行”命令来做它并且它可以工作,但是在java中没有。
提前致谢。
答案 0 :(得分:3)
正如@pcalcao指出的那样,你的第一个问题是你没有报告异常。你真的不应该这样做。至少你应该这样做:
} catch(Exception e) {
e.printStackTrace();
}
java.io.IOException:无法运行程序“C:\ Program”:CreateProcess error = 193,%1不是Win32有效应用程序
这表示您的应用程序路径存在问题。默认情况下,如果使用单个参数调用exec()
,则它将按空格分隔参数。由于路径中有空格,因此需要将字符串数组传递给exec()
。类似的东西:
try {
String cmd =
"C:\\Program Files\\MySQL\\MySQL Server 5.5\\bin\\mysqldump.exe";
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(new String[] { cmd, "-uroot", "-proot", "foo_db",
"-rC:\\backup.sql" });
// wait for it to finish
proc.waitFor();
} catch(Exception e) {
e.printStackTrace();
}
传递给exec()
的字符串数组中的第一个参数是命令的完整路径 - 这个可以有空格。每个其他数组元素都是命令的参数。
最后,您需要等待该过程完成,否则它将在后台执行。这就是waitFor()
的作用。
答案 1 :(得分:0)
你需要用\来逃避空格,exec正试图执行“C:\ Program”,这是你在回答我之前评论时所显示的内容。
从不 将catch子句留空。