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