Manipulação de processos em Java
Publicado por Cristiano Costa (última atualização em 07/04/2010)
[ Hits: 6.188 ]
Uma classe para a manipulação de processos em Java, com suporte a criação, leitura do STDOUT e STDERR, comparação entre 2 processos (usando equals()), clonagem etc.
/*********************************************************** * Esta classe esta sob a licenca Creative Commons 3.0: * http://creativecommons.org/licenses/by/3.0/br/legalcode * * @author Cristiano Bernardes * @since 04/04/2010 * @version 1.0.0.0.0 ***********************************************************/ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; /** * Classe para a execuçao de processos * * @author Cristiano Bernardes * @since 04/04/2010 * @version 1.0.0.0.0 */ public class iProcess implements Cloneable { /** * A instancia do processo. */ private Process process; /** * A linha de comando (tipo UNIX) usada para iniciar o processo. */ private String lineCMD; /** * true, se o processo pode ser clonado ou false, se o processo nao pode. */ private boolean cloneable; /** * O stdout do processo (Sendo lido por um BufferedReader). */ private BufferedReader stdout; /** * O stderr do processo (Sendo lido por um BufferedReader). */ private BufferedReader stderr; /** * Construtor padrao. * Inicia o processo pela sua linha de comando (tipo UNIX) e informando se o processo * pode ser clonado. * * @author Cristiano Bernardes * @since 04/04/2010 * @version 1.0.0.0.0 * * @param proc A linha de comando (tipo UNIX) * @param cloneable true, se pode ser clonado, false se nao pode */ public iProcess(String proc, boolean cloneable) { try { this.process = Runtime.getRuntime().exec(proc); this.lineCMD = proc; this.cloneable = cloneable; InputStream StreamEntrada = this.process.getInputStream(); InputStream StreamErro = this.process.getErrorStream(); stdout = new BufferedReader(new InputStreamReader(StreamEntrada)); stderr = new BufferedReader(new InputStreamReader(StreamErro)); } catch(IOException ex){ System.err.println("Erro de IO com o processo: "+this.lineCMD); } } /** * Retorna o comando utilizado para iniciar o processo * * @author Cristiano Bernardes * @since 04/04/2010 * @version 1.0.0.0.0 * * @return O comando utilizado para iniciar o processo */ public String getLineCMD() { return lineCMD; } /** * Retorna o STDOUT do processo * * @author Cristiano Bernardes * @since 04/04/2010 * @version 1.0.0.0.0 * * @return O STDOUT do processo */ public BufferedReader getSTDOUT() { return this.stdout; } /** * Retorna o STDERR do processo * * @author Cristiano Bernardes * @since 04/04/2010 * @version 1.0.0.0.0 * * @return O STDERR do processo */ public BufferedReader getSTDERR() { return this.stderr; } /** * Le uma linha do STDOUT do processo. * Retorna a linha lida ou null caso nao haja linhas para serem lidas. * * @author Cristiano Bernardes * @since 04/04/2010 * @version 1.0.0.0.0 * * @return A linha lida ou null caso nao haja linhas para serem lidas */ public String readLine(){ try { if(this.stdout.ready()) return this.stdout.readLine(); else return null; } catch(IOException ex){ System.err.println("Erro de IO com o processo: "+this.lineCMD); return null; } } /* * Overrides ------------------------------------------------------------------ */ /** * Retorna uma simples representaçao de caracteres com informaçoes sobre este * processo. (E um processo de mao unica, nao pode ser retornado). * * @author Cristiano Bernardes * @since 04/04/2010 * @version 1.0.0.0.0 * * @return Representaçao em String com informaçoes sobre o processo */ @Override public String toString() { return "Processo: "+this.lineCMD; } /** * Compara o processo executado por esta instancia com outro processo, retorna true, * se ambos forem a mesma linha de comando, caso contrario, retorna false. * * @author Cristiano Bernardes * @since 04/04/2010 * @version 1.0.0.0.0 * * @param obj O objeto a ser comparado * @return true, se forem a mesma linha de comando, false, se o contrario */ @Override public boolean equals(Object obj) { if(!(obj instanceof iProcess)){ return false; } return ((iProcess) obj).lineCMD.equals(this.lineCMD); } /** * Gera um hashCode (representaçao de hash desta instancia). * * @author Cristiano Bernardes * @since 04/04/2010 * @version 1.0.0.0.0 * * @return o hash code */ @Override public int hashCode() { int hash = 3; hash = 83 * hash + (this.lineCMD != null ? this.lineCMD.hashCode() : 0); return hash; } /** * Gera um clone exato desta instancia, sendo que nao e esta. * * @author Cristiano Bernardes * @since 04/04/2010 * @version 1.0.0.0.0 * * @return Um clone exato desta instancia. * @throws CloneNotSupportedException Se nao for permitida a clonagem. */ @Override protected Object clone() throws CloneNotSupportedException { if(!this.cloneable) throw new CloneNotSupportedException("Clonagem nao e permitida nesta instancia."); return new iProcess(this.lineCMD, true); } /** * Metodo chamado pelo coletor de lixo quando este detecta que nao ha mais * nada que carrega esta instancia. * Simplesmente fecha as conexoes e desinstancia as variaveis. * * @author Cristiano Bernardes * @since 04/04/2010 * @version 1.0.0.0.0 * * @throws Throwable Nao e lancado */ @Override protected void finalize() throws Throwable { this.stderr.close(); this.stdout.close(); this.process.getInputStream().close(); this.process.getOutputStream().close(); this.process.getErrorStream().close(); this.process.destroy(); this.stderr = null; this.stdout = null; this.lineCMD = null; this.process = null; } }
Pilha Dinâmica Orientada a Objetos com Java
Implementação de lista duplamente encadeada orientada a objetos
Ordenar um lista estática seqüencial de complexidade média (método da seleção)
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Flatpak: remover runtimes não usados e pacotes
Mudar o gerenciador de login (GDM para SDDM e vice-versa) - parte 2
Como atualizar o Debian 8 para o 10 (10)
Dica sobre iptables ACCEPT e DROP (6)
NGNIX - Aplicar SNAT para evitar roteamento assimetrico (29)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta