Eu preciso executar um comado no Sistema operacional e guardar o seu resultado em uma varável. É possivel …
Obrigado
Guardar Saida de commando do SO em váriavel tipo String
2 Respostas
Sim é possível,
Você vai usar o método get() da classe Runtime (não é necessário instancia-la, sempre existe em seus programas), veja: http://java.sun.com/j2se/1.4.1/docs/api/java/lang/Runtime.html (existem várias opções).
Esse método te retorna uma variável Process e com ela você pode obter informações, no caso você quer o método getOutputStream() mas existem outras funções, veja: http://java.sun.com/j2se/1.4.1/docs/api/java/lang/Process.html
:arrow: O problema é que Process é uma classe abstrata, para implementa-la você ainda deve usar algumas classe de java.io como base (Piped*) ou procure uma implementação na internet que deve existir. :?: [/code]
Olá,
Estou passando o codigo de uma classe simples que fiz para executar
processos externos, os quais preciso do conteudo de sua saida padrão.
A documentação da SUN é meio simplista quanto à este assunto, e geralmente só conseguimos fazer algo assim depois de quebrar a cabeça alguma horas.
Ai vai o codigo:
class ExternalProcess extends Thread // extende Thread, pois as vezes
{ // o processo externo
private String [] args; // pode demorar muito e vc fica
private ArrayList output; // com a aplicação lockada.
private int exitStatus;
public ExternalProcess( String [] args ) // esse array de Strings recebe
{ // a path completa do prog.
super(); // a ser executado e eventuais
this.args = args; // argumentos, sendo que o
} // path do .exe deve ser
// sempre o elemento '0'
public void start()
{
if( args != null )
super.start(); // inicializa a thread...
}
}
public void run()
{
try{
output = new ArrayList(); // espaço para alocar as linhas
// de stdout do processo.
Thread curThread = Thread.currentThread(); // ponteiro p/
// esta thread.
Runtime runt = Runtime.getRuntime(); // pega uma instancia
// de processo.
String cmdStr = args[0];
for( int i = 1 ; i < args.length ; i++ )
cmdStr += " "+args[i]; // monta a linha de execução,
// vc pode usar metodos diretos
// que recebem arrays, mas acho
// esta forma mais clara.
Process p = runt.exec( cmdStr ); // lança o processo.
// define um Reader para o stdout do processo filho.
BufferedReader bufr = new BufferedReader(
new InputStreamReader(
p.getInputStream()
)
);
String line;
while( !bufr.ready() ); // espera o stream ficar ok.
while( true )
{
try{
while( (line = bufr.readLine()) != null )
output.add( line ); // adiciona as linhas na coleção.
exitStatus = p.exitValue(); // checa o codigo de saida.
}catch( IllegalThreadStateException exp ){
// isso é lançado pelo metodo exitValue() quando o
// processo filho ainda não terminou...
curThread.sleep(1000);
continue; // volta para tentar ler linhas restantes.
}
break; // tudo terminado.
}
}catch( Exception e ){}
}
public ArrayList getOutput(){ return output;} // acessor para a coleção
// de linhas de saida.
public int getExitStatus(){ return exitStatus;}// acessor para o codigo
// de terminação do
// processo filho :
// 0 = ok, <> 0 = erro
}
como usar ?
ExternalProcess proc = new ExternalProcess(
new String[]{"dir" , "*.BAT"} );
proc.start();
proc.join(); // aqui, vc vai esperar o processo terminar para
// continuar o programa, caso queira fazer alguma outra
// coisa antes disso, basta usar as tecnicas multithreads
// convencionais.
ArrayList output = proc.getOutput(); // vc tem agora a saida do
// processo.
Lembre-se que esta classe "é um" Thread, portanto vc pode usar qualquer metodo do pai para controlar o processo da mesma.
Espero que ajude.
Claudio Gualberto.