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.

Tags:,
Petter Rafael
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.

Assinar blog por e-mail

Digite seu endereço de e-mail para assinar este blog e receber notificações de novas publicações por e-mail.

Junte-se a 322 outros assinantes

Busca

setembro 2020
DSTQQSS
 12345
6789101112
13141516171819
20212223242526
27282930 

Categorias