Mengejutkan bahwa perintah yang Anda tampilkan berfungsi sama sekali, karena Anda gagal mengutip spasi di jalur perintah. Coba:
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);
Perubahan:
- Konversikan bentuk string tunggal ke bentuk larik argumen yang jauh lebih aman dari
exec
panggilan; - Gandakan garis miring terbalik di
rawDatabase
jalur karena perintah asli Anda gagal lolos dari garis miring terbalik, jadi\r
adalah carriage return dalam string alih-alih\
char diikuti olehr
karakter. - Beralih ke garis miring terbalik dua kali lipat alih-alih garis miring ke depan pada jalur program untuk konsistensi. Perubahan ini mungkin tidak masalah.
Periksa juga status pengembalian proses. Anda harus menggunakan Process.waitFor()
kemudian setelah keluar gunakan Process.exitValue()
untuk menentukan hasilnya. Anda harus memeriksa stderr dan stdout yang ditangkap oleh Process
objek untuk kesalahan dan informasi logging.
Alasan program Anda terus tidak berfungsi mungkin karena:
- Anda memiliki
pg_restore
lama proses berkeliaran memegang kunci; dan/atau - Anda tidak menggunakan stdout dan stderr jadi
pg_restore
kehabisan ruang pipa buffer dan memblokir penulisan pada aliran keluaran.
Ini semua akan jauh lebih sederhana jika Anda gunakan ProcessBuilder
sebagai gantinya
. ProcessBuilder memungkinkan Anda menyediakan aliran file untuk menulis output dan umumnya menangani banyak hal ini untuk Anda. Anda masih harus menunggu hingga proses berhenti dan memeriksa kode pengembaliannya.