Zaskakujące jest to, że polecenie, które pokazujesz, w ogóle działa, ponieważ nie cytujesz spacji w ścieżce poleceń. Wypróbuj:
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);
Zmiany:
- Konwertuj formę jednołańcuchową na znacznie bezpieczniejszą formę tablicy argumentów
execzadzwoń; - Podwój ukośniki odwrotne w
rawDatabaseścieżka, ponieważ oryginalne polecenie nie ma ucieczki od ukośników odwrotnych, więc\rjest znakiem powrotu karetki w ciągu zamiast\znak, po którym następujerznak. - Przełącz na podwójne ukośniki odwrotne zamiast ukośników do przodu w ścieżce programu, aby zachować spójność. Ta zmiana prawdopodobnie nie ma znaczenia.
Sprawdź również status zwrotu procesu. Musisz użyć Process.waitFor()
następnie po wyjściu użyj Process.exitValue()
aby określić wynik. Powinieneś sprawdzić stderr i stdout przechwycone przez Process obiekt dla błędów i informacji o logowaniu.
Powodem, dla którego Twój program nadal nie działa, jest prawdopodobnie to, że:
- Masz stary
pg_restoreprocesy kręcące się wokół zamków; i/lub - Nie używasz stdout i stderr, więc
pg_restorezabraknie miejsca na buforowane potoki i blokuje zapis w strumieniu wyjściowym.
To wszystko będzie znacznie prostsze, jeśli użyj ProcessBuilder zamiast tego
. ProcessBuilder umożliwia dostarczanie strumieni plików do zapisywania danych wyjściowych i ogólnie zajmuje się tym za Ciebie. Musisz jednak poczekać na zakończenie procesu i sprawdzić jego kod zwrotny.