我正在尝试使用Process.waitFor()等到mysqldump完成其备份过程。这是我的代码。
///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();
}
答案 0 :(得分:2)
您需要使用子流程的输出流。此article详细说明了成功使用Process所需的一切。 (而且,这已经在stackoverflow上已经多次回答了。)
答案 1 :(得分:1)
mysqldump
转储到stdout。您可能希望将其读取为流,或使用选项-r
重定向输出。