Como executar comandos de terminal do Windows, Linux, macOS em Java e retornar o resultado completo

Publicados: 2019-02-26

Execute os comandos Linux mkdir, ls -ltra e ping em Java

Executar um system command é relativamente simples – uma vez que você o tenha visto pela primeira vez.

Envolve o uso de duas classes Java, a classe Runtime e a classe Process. Basicamente, você usa o exec method da classe Runtime para executar o comando como um processo separado.

Invocar o método exec retorna um objeto Process para gerenciar o subprocesso. Em seguida, você usa os métodos getInputStream() e getErrorStream() do objeto Process para ler a saída normal do comando e a saída de erro do comando. O que você faz com a saída do comando executado depende inteiramente de você e do aplicativo que está criando.

Os métodos ProcessBuilder.start() e Runtime.exec criam um processo nativo e retornam uma instância de uma subclasse de Process que pode ser usada para controlar o processo e obter informações sobre ele.

A classe Process fornece métodos para realizar a entrada do processo, executar a saída para o processo, aguardar a conclusão do processo, verificar o status de saída do processo e destruir (matar) o processo.

Os métodos que criam processos podem não funcionar bem para processos especiais em determinadas plataformas nativas, como processos nativos de janelas, processos daemon, processos Win16/DOS no Microsoft Windows ou scripts de shell.

Por padrão, o subprocesso criado não possui seu próprio terminal ou console. Todas as suas operações de E/S padrão (ou seja, stdin, stdout, stderr) serão redirecionadas para o processo pai, onde podem ser acessadas através dos fluxos obtidos usando os métodos getOutputStream() , getInputStream() e getErrorStream() .

O processo pai usa esses fluxos para alimentar a entrada e obter a saída do subprocesso. Como algumas plataformas nativas fornecem apenas um tamanho de buffer limitado para fluxos de entrada e saída padrão, a falha em gravar prontamente o fluxo de entrada ou ler o fluxo de saída do subprocesso pode causar o bloqueio do subprocesso ou até mesmo um impasse.

Abaixo estão dois exemplos Java simples para sua referência.

Exemplo 1. Execute mkdir, ls -ltra e ping em Java

  • Criar arquivo CrunchifyCommandJava.java
  • Execute mkdir /Users/ashah/Desktop/new-folder
  • Execute ls -ltra /Library
  • Execute ping crunchify.com

Certifique-se de alterar o caminho de acordo no programa acima de acordo com as configurações do sistema.

Saída do console do Eclipse:

Basta executar o programa acima como um aplicativo Java e você verá um resultado semelhante.

Exemplo-2.

  • CrunchifyRunCommand.java
  • Execute o comando ps -few para obter uma lista de todos os processos em execução no seu sistema.

Saída do console do Eclipse:

Estes são alguns dos processos em execução no meu MacBook Pro. Existem alguns mais, mas colados muito poucos.

Espero que este tutorial ajude você a executar qualquer comando de terminal linux e macOS usando um programa Java simples. Deixe-me saber para quaisquer perguntas.