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
exec
anrufen; - Verdoppeln Sie die Backslashes in der
rawDatabase
Pfad, da Ihr ursprünglicher Befehl Backslashes nicht maskiert, also\r
ist ein Carriage Return in der Zeichenfolge anstelle von\
char gefolgt vonr
Zeichen - 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_restore
Prozesse, die herumhängen und Sperren halten; und/oder - Sie verbrauchen stdout und stderr nicht, also
pg_restore
hat 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.