Es sorprendente que el comando que muestra funcione, ya que no cita los espacios en la ruta del comando. Prueba:
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);
Cambios:
- Convierta la forma de cadena única a la forma de matriz de argumentos mucho más segura del
exec
llamar; - Duplique las barras invertidas en
rawDatabase
ruta ya que su comando original no logra escapar de las barras diagonales inversas, por lo que\r
es un retorno de carro en la cadena en lugar de\
char seguido der
char. - Cambie a barras invertidas dobles en lugar de barras diagonales en la ruta del programa para mantener la coherencia. Este cambio probablemente no importe.
También verifique el estado de devolución del proceso. Debe usar Process.waitFor()
luego, una vez que haya salido, use Process.exitValue()
para determinar el resultado. Debe examinar el stderr y el stdout capturados por el Process
objeto para errores e información de registro.
La razón por la que su programa sigue sin funcionar es probablemente porque:
- Tienes un antiguo
pg_restore
procesos dando vueltas sosteniendo cerraduras; y/o - No estás consumiendo stdout y stderr así que
pg_restore
se queda sin espacio de tubería almacenado en búfer y bloquea la escritura en el flujo de salida.
Todo esto será mucho más sencillo si usar ProcessBuilder
en cambio
. ProcessBuilder le permite proporcionar secuencias de archivos para escribir la salida y, en general, se encarga de gran parte de esto por usted. Sin embargo, aún debe esperar a que finalice el proceso y verificar su código de retorno.