[Métodos] Ejecutar Consola (Simbolo de sistema) desde JAVA


Para poder ejecutar comandos en la consola de windows o linux, desde una aplicación java, va a ser necesario las clases:

Para poder recuperar datos que se muestran en la misma consola como el resultado de ejecutar comandos y traerlos a nuestras clases java, será necesario crear un InputStream, InputStreamReader y BufferedStream: *Tambien podria ser una buena idea, si almacenamos comandos predeterminados, determinar el sistema operativo previamente ya que no son los mismos comando en cada uno y varia dependiendo del SO

Procedimiento:

  1. En primer lugar creamos una instancia de Runtime a través de su método estático getRuntime():
    • public static Runtime getRuntime()
    • Devuelve el objeto de 'tiempo de ejecución'(Runtime) asociado con la aplicación Java actual.
      La mayoría de los métodos de la clase en Runtime son los métodos de instancia y debe ser invocada en relación con el objeto de Runtime actual.
    • Devuelve:
    • Un objeto Runtime asociado con la aplicación actual.
  2. En Sugundo lugar, este objeto retornado, llamará a un método que podrá ejecutar comandos:
  3. El comando en este punto, ya ha sido ejecutado!


    Si lo que deseamos es capturar la información que nos devuelve por consola:
  4. Creamos el objeto de la clase Process para guardar la información del subproceso realizada por el método exec() de Runtime
  5. A este objeto de la clase Process, le pedimos el flujo de entrada (InputStream) y lo guardamos en otro objeto de dicha clase:
    • public abstract InputStream getInputStream()
    • Devuelve el flujo de entrada conectado a la salida normal del subproceso. La corriente obtiene datos canalizado desde la salida estándar del proceso representado por este objeto de proceso.
      Si la salida estándar del subproceso se ha redirigido usando ProcessBuilder.redirectOutput entonces este método devolverá un flujo de entrada nula.

      De lo contrario, si el error estándar de la sub-proceso se ha redirigido usando ProcessBuilder.redirectErrorStream entonces el flujo de entrada devuelto por este método recibirá la salida estándar de la concentración y el error estándar del subproceso.
    • Devuelve
    • un objeto 'java.io.InputStream' - el flujo de entrada conectado a la salida normal del subproceso
  6. Crear un objeto de 'InputStreamReader' pasandole como parámetro de su constructor el inputstream creado recientemente:
  7. Crear un objeto BufferedReader a partir del InputStreamReader:
    • public BufferedReader(Reader in)
    • Crea un flujo de caracteres de entrada de búfer que utiliza una memoria intermedia de entrada de tamaño predeterminado.
    • Parámetro:
    • InputStreamReader in - Un objeto Reader, clase padre de InputStreamReader.
  8. Para finalizar, hay que ir recorriendo en un ciclo while el bufferedReader a través de su método readLine() para obtener en cada vuelta un string con la información devuelta:
    • public String readLine() throws IOException
    • Lee una línea de texto. Se considera que una fila para ser terminado por cualquiera de un avance de línea ('\ n'), un retorno de carro ('\ r'), o un retorno de carro seguido inmediatamente por un salto de línea.
    • Devuelve:
    • Una cadena de texto (objeto String) que contiene el contenido de la línea, sin incluir los caracteres de fin de línea.
      O 'null' si se ha alcanzado el final de la secuencia
    • Arroja:
    • IOException - Si ocurre algun error de entrada/salida.
  9. Podremos guardar en un String, mostrar por pantalla, etc y para concluir cerrar el buffer con su método close()


    1. 
      Runtime tiempoEjecucion = Runtime.getRuntime();
      Process proceso = tiempoEjecucion.exec("cmd.exe /C " + miComando);
      			
      InputStream is = proceso.getInputStream();
      InputStreamReader isr = new InputStreamReader(is);
      BufferedReader br = new BufferedReader(isr);
      			
      String linea;
      while ((linea = br.readLine()) != null) {
      	//TODO
      }
      br.close();
      
      


      Un metodo para imprima por pantalla o que guarde en un String serían del tipo:

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      public static void ejecutarComando(String comando){
          try {
              Runtime tiempoEjecucion = Runtime.getRuntime();
              Process proceso = tiempoEjecucion.exec("cmd.exe /C " + comando);
      		
              InputStream is = proceso.getInputStream();
              InputStreamReader isr = new InputStreamReader(is);
              BufferedReader br = new BufferedReader(isr);
      		
              String linea;
              while ((linea = br.readLine()) != null) {
                  System.out.println(linea);
              }
              br.close();
          } catch (IOException e) {
      	e.printStackTrace();
          }
      }
      public static String ejecutarComando1(String comando){
          String cadenaRetorno = "";
          try {
              Runtime tiempoEjecucion = Runtime.getRuntime();
              Process proceso = tiempoEjecucion.exec("cmd.exe /C " + comando);
      		
              InputStream is = proceso.getInputStream();
              InputStreamReader isr = new InputStreamReader(is);
              BufferedReader br = new BufferedReader(isr);
      		
              String linea;
              while ((linea = br.readLine()) != null) {
      	    cadenaRetorno = cadenaRetorno.concat(linea) + "\n";
              }
              br.close();
          } catch (IOException e) {
      	e.printStackTrace();
          }
          return cadenaRetorno;
      }
      

      La llamda de estos metodos podria ser:
      
      ejecutarComando("cd C:/Developer/blog01 && dir");	
      
      


      ALgunos comandos de la consola windows son:
      CD Permite cambiar de un directorio activo a otro
      DATE Muestra o establece la fecha del sistema
      DEL Permite eliminar archivos
      DEFRAG Permite desfragmentar un disco duro
      DIR Permite ver todos los archivos y directorios de la ruta en la que nos encontramos
      FC Compara dos archivos y verifica que las copias son exactas
      FIND Busca una cadena de texto en uno o más archivos
      FINDSTR Busca cadenas de texto en archivos
      FOR Ejecuta un comando para cada archivo en un conjunto de archivos
      FORMAT Da formato a un disco para usarse con Windows
      FTYPE Muestra o modifica los tipos de archivo utilizados en una asociación de archivos
      GOTO Direcciona el intérprete de comandos de Windows a una línea en un programa por lotes
      GRAFTABL Permite a Windows mostrar un conjunto de caracteres extendidos en modo gráfico
      HELP Proporciona información de ayuda para los comandos de Windows
      IF Ejecuta procesos condicionales en programas por lotes
      LABEL Crea, cambia o elimina la etiqueta del volumen de un disco
      MD y MKDIR Crea un directorio
      MODE Configura un dispositivo de sistema
      MORE Muestra la información pantalla por pantalla
      MOVE Mueve uno o más archivos de un directorio a otro en la misma unidad
      PATH Muestra o establece una ruta de búsqueda para archivos ejecutables
      PAUSE Suspende el proceso de un archivo por lotes y muestra un mensaje
      POPD Restaura el valor anterior del directorio actual guardado por PUSHD
      PRINT Imprime un archivo de texto
      PROMPT Cambia el símbolo de comando de Windows
      PUSHD Guarda el directorio actual y después lo cambia
      RD Elimina un directorio
      RECOVER Recupera la información legible de un disco dañado o defectuoso
      REGEDIT Abre el editor de Registro
      REM Graba comentarios en archivos por lotes o CONFIG.SYS
      REN y RENAME Cambia el nombre de uno o más archivos
      REPLACE Reemplaza archivos
      RMDIR Elimina un directorio
      SET Muestra, establece o elimina variables de entorno de Windows
      SETLOCAL Inicia la localización de cambios del entorno en un archivo por lotes
      SHIFT Cambia posición de modificadores reemplazables en archivos por lotes
      SHUTDOWN -s -t xxxx Apaga el equipo, donde 'xxxx' es el tiempo medido en segundos.
      SORT Ordena las entradas
      START Inicia otra ventana para ejecutar un programa o comando
      SUBST Asocia una ruta de acceso con una letra de unidad
      SYS Crea un disco de sistema
      TIME Muestra o establece la hora del sistema
      TITLE Establece el título de la ventana de una sesión de cmd.exe
      TREE Muestra gráficamente la estructura de directorios de una unidad o ruta de acceso
      TYPE Muestra el contenido de un archivo de texto
      VER Muestra la versión de Windows
      VERIFY Comunica a Windows si debe comprobar que los archivos se escriben de forma correcta en un disco
      VOL Muestra la etiqueta del volumen y el número de serie del disco
      XCOPY Copia archivos y árboles de directorios

1 comentario:

  1. muy bueno.... se acerca mucho a lo que he estado buscando ... llenar un jtable con las direcciones mac de las pcs de una red lan.

    gracias!!

    ResponderEliminar