2012-02-10 76 views
0

我有这个代码的问题:如何使用运行时/进程类从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没有。

在此先感谢。

+2

它会抛出异常吗?尝试在catch子句中添加e.printStackTrace()。 – pcalcao 2012-02-10 17:33:48

+0

uhm ...是的,现在它发生了错误: “java.io.IOException:无法运行程序”C:\ Program“:CreateProcess错误= 193,%1不是Win32有效的应用程序” – user1197919 2012-02-10 17:44:07

回答

0

您需要用\转义空格,exec正尝试执行“C:\ Program”,从您在我之前的评论的答案中显示的内容中执行。

从不假设catch子句为空。

+0

解决了把'\“'放到路径上,现在可以运行了 感谢您的建议! – user1197919 2012-02-10 18:12:15

+0

没问题:)正确的答谢方式是通过接受答案;) – pcalcao 2012-02-10 18:13:38

3

您的第一个问题是,正如@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()所做的。

+0

经典的'路径中的空间'问题。 – citizenen 2015-01-16 18:53:05