如何使用运行时/进程类从java备份一个mysql数据库?
我有这个代码的问题:如何使用运行时/进程类从java备份一个mysql数据库?
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) {}
它没有得到任何错误,它pratically不会做任何事情:没有备份和无CMD的执行。问题在哪里?
这很奇怪,因为cmd文本是正确的......我试图用'执行'命令在Windows中,它的工作原理,但在Java没有。
在此先感谢。
您需要用\转义空格,exec正尝试执行“C:\ Program”,从您在我之前的评论的答案中显示的内容中执行。
从不假设catch子句为空。
解决了把'\“'放到路径上,现在可以运行了 感谢您的建议! – user1197919 2012-02-10 18:12:15
没问题:)正确的答谢方式是通过接受答案;) – pcalcao 2012-02-10 18:13:38
您的第一个问题是,正如@pcalcao指出的那样,您没有报告异常。你真的不应该这样做。至少,你应该做的:
} catch(Exception e) {
e.printStackTrace();
}
java.io.IOException: Cannot run program "C:\Program": CreateProcess error=193, %1 isn't a Win32 valid application
,说,你有你的应用程序路径的问题。默认情况下,如果使用单个参数调用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()
所做的。
经典的'路径中的空间'问题。 – citizenen 2015-01-16 18:53:05
它会抛出异常吗?尝试在catch子句中添加e.printStackTrace()。 – pcalcao 2012-02-10 17:33:48
uhm ...是的,现在它发生了错误: “java.io.IOException:无法运行程序”C:\ Program“:CreateProcess错误= 193,%1不是Win32有效的应用程序” – user1197919 2012-02-10 17:44:07