Estou usando o tempo de execução para executar comandos do prompt de comando do meu programa Java. No entanto, não estou ciente de como posso obter a saída que o comando retorna.
Aqui está o meu código:
Runtime rt = Runtime.getRuntime();
String[] commands = {"system.exe", "-send" , argument};
Process proc = rt.exec(commands);
Eu tentei fazer, System.out.println(proc);
mas isso não retornou nada. A execução desse comando deve retornar dois números separados por ponto e vírgula. Como eu pude obter isso em uma variável para imprimir?
Aqui está o código que estou usando agora:
String[] commands = {"system.exe", "-get t"};
Process proc = rt.exec(commands);
InputStream stdIn = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(stdIn);
BufferedReader br = new BufferedReader(isr);
String line = null;
System.out.println("<OUTPUT>");
while ((line = br.readLine()) != null)
System.out.println(line);
System.out.println("</OUTPUT>");
int exitVal = proc.waitFor();
System.out.println("Process exitValue: " + exitVal);
Mas não estou conseguindo nada como minha saída, mas quando executo esse comando, ele funciona bem.
pwd && ls
não é apenas a execução de um único arquivo, quando você faz isso em um shell que executa tanto o/bin/pwd
e/bin/ls
executáveis. Se você quiser fazer coisas assim dentro do java, precisará fazer algo assim{"/bin/bash","-c", "pwd && ls"}
. Você provavelmente não tem mais a pergunta, mas outras pessoas podem, então pensei em responder.stdout
estderr
saída limitados . Se você não os ouvir simultaneamente, um deles será preenchido enquanto você estiver lendo o outro. O programa que você está ouvindo bloqueará a tentativa de gravação no buffer preenchido, enquanto, por outro lado, o programa bloqueará a tentativa de leitura de um buffer que nunca retornaráEOF
. Você deve ler os dois fluxos simultaneamente.Uma maneira mais rápida é esta:
Que é basicamente uma versão condensada disso:
Sei que esta pergunta é antiga, mas estou postando esta resposta porque acho que isso pode ser mais rápido.
fonte
\A
em um regex, significa início da string e tive que escapar da barra.Além de usar o
ProcessBuilder
Senthil sugerido, leia e implemente todas as recomendações de When Runtime.exec () não .fonte
ProcessBuilder
como agora recomendado duas vezes. Usando aProcessBuilder
, é possível mesclar os fluxos de saída e erro para facilitar o consumo de ambos de uma só vez.Se o uso já tiver o Apache commons-io disponível no caminho de classe, você poderá usar:
fonte
Também podemos usar fluxos para obter a saída do comando:
fonte
As respostas @Senthil e @Arend ( https://stackoverflow.com/a/5711150/2268559 ) mencionadas
ProcessBuilder
. Aqui está o exemplo usandoProcessBuilder
com a especificação de variáveis de ambiente e pasta de trabalho para o comando:fonte
No momento da redação deste artigo, todas as outras respostas que incluem código podem resultar em conflitos.
Os processos têm um buffer limitado para
stdout
estderr
saída. Se você não os ouvir simultaneamente, um deles será preenchido enquanto você estiver tentando ler o outro. Por exemplo, você pode esperar para lerstdout
enquanto o processo está aguardando para gravarstderr
. Você não pode ler dostdout
buffer porque está vazio e o processo não pode gravar nostderr
buffer porque está cheio. Vocês estão esperando um pelo outro para sempre.Aqui está uma maneira possível de ler a saída de um processo sem risco de conflitos:
A chave é usar o
ProcessBuilder.redirectErrorStream(true)
que será redirecionadostderr
para ostdout
fluxo. Isso permite que você leia um único fluxo sem ter que alternar entrestdout
estderr
. Se você deseja implementar isso manualmente, precisará consumir os fluxos em dois threads diferentes para garantir que nunca bloqueie.fonte
Se você escreve no Kotlin, pode usar:
fonte
Adaptado da resposta anterior:
fonte
Praticamente o mesmo que outros trechos nesta página, mas apenas organizando as coisas por uma função , aqui vamos nós ...
A função Class:
fonte
Tente ler
InputStream
o tempo de execução:Você também pode precisar ler o fluxo de erros (
proc.getErrorStream()
) se o processo estiver imprimindo uma saída de erro. Você pode redirecionar o fluxo de erros para o fluxo de entrada, se você usarProcessBuilder
.fonte