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:
- 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.
- En Sugundo lugar, este objeto retornado, llamará a un método que podrá ejecutar comandos:
- public Process exec(String command) throws IOException
- Parámetro:
- String command - El comando que queramos ejecutar, en una cadena de texto.
- Devuelve:
- Objeto 'java.lang.Process' - Un nuevo objeto de la clase 'Process' con la información del subproceso realizado.
- Arroja
- SecurityException - Si existe un administrador de seguridad y su método checkExec() no permite la creación del subproceso.
IOException - Si se produce un error de Entrada/Salida
NullPointerException - Si el comando es nulo.
IllegalArgumentException - Si el comando está vacía
- El comando en este punto, ya ha sido ejecutado!
Si lo que deseamos es capturar la información que nos devuelve por consola: - Creamos el objeto de la clase Process para guardar la información del subproceso realizada por el método exec() de Runtime
- 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
- Crear un objeto de 'InputStreamReader' pasandole como parámetro de su constructor el inputstream creado recientemente:
- public InputStreamReader(InputStream in)
- Crea un InputStreamReader que utiliza el charset de caracteres por defecto.
- Parámetros:
- InputStream in - el inputStream creado recientemente.
- 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.
- 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.
- Podremos guardar en un String, mostrar por pantalla, etc y para concluir cerrar el buffer con su método close()
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 |
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 |
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.
ResponderEliminargracias!!