Executando comandos do DOS via Java – melhorando

[ad#texto]

Voltamos a falar de Java, já leram o post anterior, sobre como executar comandos de sistema no Java? Conforme relatei ele tem um pequeno bug, que vasculhando a internet ninguém havia notado.

O bug consiste em comandos Java, como por exemplo o java –version, por uma característica ele retorna do RunTime via método getErrorStream(), resumindo, retorna como se fosse um erro, mesmo que o comando tenha sido executado normalmente.

Como a rotina trata o retorno direto dos métodos getErrorStream() e getInputStream() a rotina acaba gerando uma informação errônea, mas como consertar? Simples, basta fazer um controle pelo retorno do exitValue(), que retornará zero no caso de sucesso ou 1 no caso de erros.

Veja como ficou a solução proposta:

public class ExecComando {

public static void executar(java.lang.String scriptExec, java.lang.String typeCommand, java.lang.String command){

String[] finalCommand;

finalCommand = new String[3];

finalCommand[0] = scriptExec;

finalCommand[1] = typeCommand;

finalCommand[2] = command;

Process proc;

String sucesso = "", erro = "", escuta;

try{

proc = Runtime.getRuntime().exec(finalCommand);

proc.waitFor();

int retorno = proc.exitValue();

BufferedReader inputSucesso = new BufferedReader(new InputStreamReader(proc.getInputStream()));

BufferedReader inputErro = new BufferedReader(new InputStreamReader(proc.getErrorStream()));

while ((escuta = inputSucesso.readLine()) != null) {

sucesso += escuta + "\n";

}

inputSucesso.close();

while ((escuta = inputErro.readLine()) != null) {

erro += escuta + "\n";

}

inputErro.close();

if(retorno == 0){

System.out.println("Sucesso!");

if(!erro.equals("")){

System.out.println(erro);

}else{

System.out.println(sucesso);

}

}else{

System.out.println("Erro!");

System.out.println(erro);

}

}catch (IOException ex) {

ex.printStackTrace();

}catch (InterruptedException ie){

ie.printStackTrace();

}

}

}

Basicamente capturamos o inteiro que representa o nosso retorno e modificamos a forma como ocorre a impressão no console, assim temos o bug reportado corrigido e a rotina funcional.

Na internet é possível encontrar soluções que vão desde a implementação de Threads para a captura de sucesso e erro ou ainda a possibilidade de utilizar um ProcessBuilder para parametrizar o Path do Java, mas se você procura apenas uma solução rápida, flexível e funcional para servir de interface entre suas outras classes e o sistema operacional a solução apresentada aqui ainda é a mais propícia.

Petter Rafael

Desenvolvedor Web atua com as tecnologias Java e PHP apoiadas pelos bancos de dados Oracle e MySQL. Além dos ambientes de desenvolvimento acima possuiu amplo conhecimento em servidores Apache/Tomcat, Photoshop, Arte & Foto, Flash e mais uma dezena de ferramentas e tecnologias emergentes. Atualmente colabora com o Viablog escrevendo sobre programação e tecnologia.
ViamaisBLOG
Privacy Overview

This website uses cookies so that we can provide you with the best user experience possible. Cookie information is stored in your browser and performs functions such as recognising you when you return to our website and helping our team to understand which sections of the website you find most interesting and useful.