Manipulação de processos em Java
Publicado por Cristiano Costa (última atualização em 07/04/2010)
[ Hits: 6.540 ]
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
HACK :: Microsoft SQL 2000 JDBC Driver
Implementação de lista duplamente encadeada orientada a objetos
Instalando java no ubuntu, fácil e rápido...
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Opções secretas em tema do Cinnamon
Como mapear unidade de rede no Linux
Como quebrar senha usando john the ripper
Alguém pode me indicar um designer freelancer? [RESOLVIDO] (1)
Alguém já testou o novo COSMIC Desktop? O que achou? (4)
Não consigo instalar distro antiga no virtualbox nem direto no hd (29)
queria saber como posso alterar a frequencia do meu ryzen 2300u pro (3)









