2012-02-10 65 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