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
exec
cuộc gọi; - Gấp đôi các dấu gạch chéo ngược trong
rawDatabase
vì lệnh ban đầu của bạn không thoát được dấu gạch chéo ngược, vì vậy\r
là một ký tự xuống dòng trong chuỗi thay vì\
char theo sau làr
char. - 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_restore
cũ 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_restore
hế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ó.