好的,這是最終的解決方案。你需要把「過程閱讀器到文件作家」的代碼放到一個單獨的線程,最後等待完成進程對象:
// 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文件的路徑中存在空格!
您複製/粘貼到我認爲的大部分命令。該命令將管道輸出到文件。如果你通過Java調用它,那麼你不這樣做,你捕獲該進程的輸出並在Java代碼中寫入文件。 – Gimby
命令本身是正確的。但是你是對的,運行時庫不支持該管道。我將嘗試手動將過程輸出寫入文件。非常感謝! – salocinx
順便說一句:管道響應。重定向在Linux上運行Runtime.exec(),我想也是在MacOS上。 – salocinx