Guardar Saida de commando do SO em váriavel tipo String

2 respostas
J

Eu preciso executar um comado no Sistema operacional e guardar o seu resultado em uma varável. É possivel …
Obrigado

2 Respostas

smota

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]

C

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.

Criado 21 de fevereiro de 2003
Ultima resposta 23 de fev. de 2003
Respostas 2
Participantes 3