Het is verrassend dat de opdracht die je laat zien überhaupt werkt, omdat je de spaties in het opdrachtpad niet aanhaalt. Probeer:
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);
Wijzigingen:
- Converteer de vorm met één string naar de veel veiligere array-vorm voor argumenten van de
exec
bellen; - Dubbel de backslashes in de
rawDatabase
pad omdat uw oorspronkelijke commando niet kan ontsnappen aan backslashes, dus\r
is een regelterugloop in de tekenreeks in plaats van de\
char gevolgd door der
char. - Schakel over naar dubbele backslashes in plaats van forwardslashes op het programmapad voor consistentie. Deze wijziging doet er waarschijnlijk niet toe.
Controleer ook de retourstatus van het proces. U moet Process.waitFor()
gebruik daarna Process.exitValue()
om het resultaat te bepalen. Je moet de stderr en stdout onderzoeken die zijn vastgelegd door het Proces
object voor fouten en loginformatie.
De reden dat uw programma niet blijft werken, is waarschijnlijk omdat:
- Je hebt een oude
pg_restore
processen die rondhangen met sloten; en/of - Je gebruikt stdout en stderr niet, dus
pg_restore
heeft geen gebufferde pijpruimte meer en blokkeert schrijven op de uitvoerstroom.
Dit zal allemaal veel eenvoudiger zijn als u gebruik ProcessBuilder
in plaats daarvan
. Met ProcessBuilder kunt u bestandsstromen leveren om uitvoer naar te schrijven en regelt dit over het algemeen veel voor u. U moet echter nog steeds wachten tot het proces is beëindigd en de retourcode controleren.