2012-03-12 39 views
1

我想使用Process.waitFor()等到mysqldump完成其備份過程。這是我的代碼。Process.waitFor()在mysql備份期間永遠等待

///i use this mysql command, its working fine 
    String dump = "bkprefs/mysqldump " 
      + "--host=localhost "  
      + "--port=3306 " 
      + "--user=root " 
      + "--password= " 
      + "--add-drop-table " 
      + "--add-drop-database " 
      + "--complete-insert " 
      + "--extended-insert " 
      + "test"; 
    //execute the command 
    Process run = null; 
    try { 
     run = Runtime.getRuntime().exec(dump); 
     int stat = run.waitFor(); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 

問題是,run.waitfor()掛起。它似乎一直在等待一些不會發生的事情。

當我將行int stat = run.waitFor()替換爲Thread.sleep(5)時,備份工作正常。但我不能堅持這一點,因爲備份時間會根據數據庫的大小而有所不同,因此使用Thread.sleep等待備份過程完成並不安全。

請幫幫我。回覆非常感謝。

編輯:

我使用下面的代碼消耗其輸入流。

InputStream in = run.getInputStream(); 
    FileWriter fstream = null; 
    try { 
     fstream = new FileWriter("haha.sql"); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
    BufferedWriter out = new BufferedWriter(fstream); 

    int nextChar; 
    StringBuffer sb = new StringBuffer(); 
    try { 
     while ((nextChar = in.read()) != -1) { 
      out.write((char) nextChar); 
      //sb.append((char) nextChar); 
     } 
     out.flush(); 
     out.close(); 

    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 

回答

2

您需要消耗來自子流程的輸出流。這article詳細介紹了成功使用過程所需的一切。 (另外,這可能已經在stackoverflow中被回答了很多次)。

+0

我剛剛發佈的代碼後面的代碼完全符合您的說法 – Jemp 2012-03-12 14:57:59

+0

@Bnrdo - 您是否在使用_separate Thread_來處理這些流(詳見該文章)? – jtahlborn 2012-03-12 17:25:00

+0

不,用於處理這些流的代碼實際上遵循備份代碼。 – Jemp 2012-03-13 13:12:12

1

mysqldump轉儲到標準輸出。您可能需要閱讀該流,或使用選項-r重定向輸出。

+0

謝謝你的回覆。我編輯了我的帖子,所以你看到我讀了流,所以我認爲這不是我的問題。 – Jemp 2012-03-12 15:02:44