Thật ngạc nhiên là lệnh bạn hiển thị hoàn toàn hoạt động, vì bạn không thể trích dẫn các khoảng trắng trong đường dẫn lệnh. Hãy thử:
String[] cmd = {
"D:\\Program Files\\PostgreSQL\\9.1\\bin\\pg_restore.exe",
"--host", "localhost",
"--port", "5432",
"--username", "postgres",
"--dbname", "mytestqq",
"--role", "postgres",
"--no-password",
"--verbose",
"D:\\sathish\\rawDatabase.backup"
};
p = r.exec(cmd);
Các thay đổi:
- Chuyển đổi dạng chuỗi đơn thành dạng mảng đối số an toàn hơn nhiều của
execcuộc gọi; - Gấp đôi các dấu gạch chéo ngược trong
rawDatabasevì lệnh ban đầu của bạn không thoát được dấu gạch chéo ngược, vì vậy\rlà một ký tự xuống dòng trong chuỗi thay vì\char theo sau làrchar. - Chuyển sang dấu gạch chéo ngược kép thay vì dấu gạch chéo ngược trên đường dẫn chương trình để có tính nhất quán. Thay đổi này có lẽ không thành vấn đề.
Đồng thời kiểm tra trạng thái trả lại của quá trình. Bạn phải sử dụng Process.waitFor()
sau đó khi nó đã thoát sử dụng Process.exitValue()
để xác định kết quả. Bạn nên kiểm tra stderr và stdout được Process ghi lại đối tượng cho lỗi và thông tin ghi nhật ký.
Lý do chương trình của bạn tiếp tục không hoạt động có thể là do:
- Bạn có
pg_restorecũ quy trình treo xung quanh việc giữ ổ khóa; và / hoặc - Bạn không sử dụng stdout và stderr nên
pg_restorehết không gian ống được đệm và chặn việc ghi trên luồng đầu ra.
Tất cả điều này sẽ đơn giản hơn nhiều nếu bạn sử dụng ProcessBuilder thay vào đó
. ProcessBuilder cho phép bạn cung cấp các luồng tệp để ghi đầu ra và thường đảm nhận rất nhiều việc này cho bạn. Tuy nhiên, bạn vẫn phải đợi quá trình kết thúc và kiểm tra mã trả lại của nó.