É surpreendente que o comando que você mostra funcione, já que você não está citando os espaços no caminho do comando. Tentar:
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);
Mudanças:
- Converter o formulário de string única para o formato de array de argumentos muito mais seguro do
exec
ligue; - Duplique as barras invertidas no
rawDatabase
path, pois seu comando original não consegue escapar de barras invertidas, então\r
é um retorno de carro na string em vez do\
char seguido pelor
caractere. - Mude para barras invertidas duplas em vez de barras no caminho do programa para manter a consistência. Essa mudança provavelmente não importa.
Verifique também o status de devolução do processo. Você deve usar
Process.waitFor()
depois de sair, use Process.exitValue()
para determinar o resultado. Você deve examinar o stderr e o stdout capturados pelo Process
objeto para erros e informações de registro. A razão pela qual o seu programa continua a não funcionar é provavelmente porque:
- Você tem o
pg_restore
antigo processos pendurados segurando fechaduras; e/ou - Você não está consumindo stdout e stderr, então
pg_restore
fica sem espaço em buffer e bloqueia a gravação no fluxo de saída.
Tudo será muito mais simples se você use
ProcessBuilder
em vez disso
. O ProcessBuilder permite fornecer fluxos de arquivos para gravar a saída e geralmente cuida de muito disso para você. Você ainda deve esperar que o processo termine e verifique seu código de retorno.