Es ist überraschend, dass der von Ihnen gezeigte Befehl überhaupt funktioniert, da Sie die Leerzeichen im Befehlspfad nicht anführen. Versuchen Sie:
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);
Änderungen:
- Konvertieren Sie die Einzelstring-Form in die viel sicherere Argument-Array-Form von
execanrufen; - Verdoppeln Sie die Backslashes in der
rawDatabasePfad, da Ihr ursprünglicher Befehl Backslashes nicht maskiert, also\rist ein Carriage Return in der Zeichenfolge anstelle von\char gefolgt vonrZeichen - Wechseln Sie aus Gründen der Konsistenz zu doppelten umgekehrten Schrägstrichen anstelle von Schrägstrichen im Programmpfad. Diese Änderung spielt wahrscheinlich keine Rolle.
Überprüfen Sie auch den Rückgabestatus des Prozesses. Sie müssen Process.waitFor()
Verwenden Sie nach dem Beenden Process.exitValue()
um das Ergebnis zu bestimmen. Sie sollten die vom Process erfassten stderr und stdout untersuchen Objekt für Fehler und Protokollinformationen.
Der Grund, warum Ihr Programm weiterhin nicht funktioniert, ist wahrscheinlich folgender:
- Du hast altes
pg_restoreProzesse, die herumhängen und Sperren halten; und/oder - Sie verbrauchen stdout und stderr nicht, also
pg_restorehat keinen gepufferten Pipe-Platz mehr und blockiert das Schreiben auf dem Ausgabestream.
Dies wird alles viel einfacher, wenn Sie verwenden Sie ProcessBuilder stattdessen
. Mit ProcessBuilder können Sie Dateistreams bereitstellen, in die Ausgaben geschrieben werden können, und übernimmt im Allgemeinen einen Großteil davon für Sie. Sie müssen trotzdem warten, bis der Prozess beendet ist, und seinen Rückgabecode überprüfen.