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
execbellen; - Dubbel de backslashes in de
rawDatabasepad omdat uw oorspronkelijke commando niet kan ontsnappen aan backslashes, dus\ris een regelterugloop in de tekenreeks in plaats van de\char gevolgd door derchar. - 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_restoreprocessen die rondhangen met sloten; en/of - Je gebruikt stdout en stderr niet, dus
pg_restoreheeft 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.