2014-07-22 117 views
1

我想我的Java應用程序中轉儲MySQL數據庫的方式如下:。從Windows調用 「mysqldump的」 與調用Runtime.getRuntime()EXEC(CMD)7

String[] command = new String[] {"cmd.exe", "/c", "C:/mysql/mysqldump.exe" --quick --lock-tables --user=\"root\" --password=\"mypwd\" mydatabase > \"C:/mydump.sql\""}; 
Process process = Runtime.getRuntime().exec(command); 
int exitcode = process.waitFor(); 

過程失敗,×[出口代碼6.我在某處發現操作數「>」沒有正確解釋,並且提示使用「cmd.exe/c」作爲前綴。但它仍然不起作用。

任何想法?

+1

您複製/粘貼到我認爲的大部分命令。該命令將管道輸出到文件。如果你通過Java調用它,那麼你不這樣做,你捕獲該進程的輸出並在Java代碼中寫入文件。 – Gimby

+1

命令本身是正確的。但是你是對的,運行時庫不支持該管道。我將嘗試手動將過程輸出寫入文件。非常感謝! – salocinx

+0

順便說一句:管道響應。重定向在Linux上運行Runtime.exec(),我想也是在MacOS上。 – salocinx

回答

2

好的,這是最終的解決方案。你需要把「過程閱讀器到文件作家」的代碼放到一個單獨的線程,最後等待完成進程對象:

// define backup file 
    File fbackup = new File("C:/backup.sql"); 
    // execute mysqldump command 
    String[] command = new String[] {"cmd.exe", "/c", "C:/path/to/mysqldump.exe --quick --lock-tables --user=myuser --password=mypwd mydatabase"}; 
    final Process process = Runtime.getRuntime().exec(command); 
    // write process output line by line to file 
    if(process!=null) { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try{ 
        try(BufferedReader reader = new BufferedReader(new InputStreamReader(new DataInputStream(process.getInputStream()))); 
         BufferedWriter writer = new BufferedWriter(new FileWriter(fbackup))) { 
         String line; 
         while((line=reader.readLine())!=null) { 
          writer.write(line); 
          writer.newLine(); 
         } 
        } 
       } catch(Exception ex){ 
        // handle or log exception ... 
       } 
      } 
     }).start(); 
    } 
    if(process!=null && process.waitFor()==0) { 
     // success ... 
    } else { 
     // failed 
    } 

在Linux上,你可以直接重新定向命令的輸出通過像往常一樣使用「>」...(也在Mac OS X認爲)。所以不需要線程。一般來說,請避免通往mysqldump/mysqldump.exe文件的路徑中存在空格!

+0

它不能正常工作,無法創建數據庫備份 – AnonymousDev

+0

究竟是什麼問題?請提供一些輸出。你在使用什麼操作系統? – salocinx

+0

我正在使用Windows 10中,MySQL服務器5.6,JDK 1.7和問題是其他部分即失敗的部分執行where process.waitFor()!= 0 – AnonymousDev

3

是的,你是對的,前幾天我做了類從MySQL數據庫導出... 您coud從控制檯讀取輸出sream,然後寫入文件

String[] command = new String[] {"cmd.exe", "/c", "\"C:/Program Files/MySQL/MySQL Server 5.6/bin/mysqldump.exe\" --quick --lock-tables --user=\"root\" --password=\"mypwd\" mydatabase "}; 
    Process process = Runtime.getRuntime().exec(command); 
    BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream())); 
    while ((line = input.readLine()) != null) { 

     System.out.println(line); //there you can write file 
    } 
    input.close(); 

問候

相關問題