Изненадващо е, че командата, която показвате, изобщо работи, тъй като не успявате да цитирате интервалите в командния път. Опитайте:
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);
Промени:
- Преобразувайте формата с един низ в много по-безопасната форма на масив от аргументи на
exec
обаждане; - Удвоете обратните наклонени черти в
rawDatabase
път, тъй като оригиналната ви команда не успява да избегне обратните наклонени черти, така че\r
е връщане на каретка в низа вместо\
char, последван отr
char. - Превключете към удвоени обратни наклонени черти вместо наклонени черти напред в пътя на програмата за последователност. Тази промяна вероятно няма значение.
Също така проверете състоянието на връщане на процеса. Трябва да използвате Process.waitFor()
след това, след като излезе, използвайте Process.exitValue()
за определяне на резултата. Трябва да прегледате stderr и stdout, уловени от Process
обект за грешки и информация за регистриране.
Причината, поради която програмата ви продължава да не работи, вероятно е следната:
- Имате стар
pg_restore
процеси, висящи около държащи ключалки; и/или - Вие не използвате stdout и stderr, така че
pg_restore
изчерпва буферираното пространство на канала и блокира записа в изходния поток.
Всичко това ще бъде много по-лесно, ако използвайте ProcessBuilder
вместо това
. ProcessBuilder ви позволява да предоставяте файлови потоци за запис на изход и като цяло се грижи за голяма част от това вместо вас. Все пак трябва да изчакате процесът да приключи и да проверите неговия код за връщане.