domingo, 1 de febrero de 2009

Ejecutando desde Java

En muchas ocasiones nuestra aplicaciones necesitan interactuar con software que residen en las PC de los usuarios, para realizar funciones tan comunes como lanzar una web en el navegador por defecto de nuestro sistema operativo o abrir una ventana para enviar un correo a una determina dirección. En un lenguaje como Java, donde el acceso a funciones nativas del sistema se puede volver una tarea algo engorrosa y tenemos que optar por variantes menos complejas y que nos faciliten una mayor rapidez en el desarrollo del software. Una solución podría ser beneficiarnos de otro programa escrito en algún lenguaje que nos facilites dichas funcionalidades.

Gracias al rico arsenal de funcionalidades que “Sun Microsystems” creo para nosotros estas tareas que nos planteamos solucionar no es gran problema, en el paquete AWT contamos con la clase Desktop (java.awt.Desktop) que nos facilitará parte de dicho problema.
1 - Podemos lanzar el navegador con la página que queramos sin preocuparnos por cual está instalado o donde está o cual es el preferido del usuario:
Desktop.getDesktop().browse(new URI("http://blackhat.org"));

2- Abrir una ventana lista para obtener una subscripción de BlackHat vía correo:

Desktop.getDesktop().mail(new URI("mailto:blackhat4all@gmail.com?subject=Suscripción"));


3- También es posible editar un determinado fichero con su software asignado por defecto en nuestro sistema:

Desktop.getDesktop().edit(new File("F:/articulo.docx"));


4- Nos permite también ejecutar un determinado archivo con su software asociado al igual que enviar a la impresora un documentó que queramos imprimir:

Desktop.getDesktop().open(new File("g:/disko.mp3"));
Desktop.getDesktop().print(new File("g:/listado.xls"));


Ya hemos visto las formas más simples de lanzar tareas cotidianas desde nuestro software, ahora veremos como obtener datos que nos pueden brindar otras aplicaciones o ejecutar funcionalidades las cuales no podemos realizar desde nuestra aplicación.

El responsable de esta tarea será “Runtime” quien nos facilitará la ejecución y comunicación con ejecutables externos, para ejecutar un .exe externo quedaría así:

Runtime.getRuntime().exec("wmplayer");


Pasándole argumentos:

Runtime.getRuntime().exec("wmplayer d:/películas/Hacker.mpg");


Pero esto no se queda solo aquí cuando ejecutamos el método exec() nos devuelve un objeto del tipo java.lang.Process que cuenta con los métodos:
destroy() –permite terminar el proceso que levantamos al ejecutar la aplicación
getErrorStream() –Permite obtener las excepciones o errores que lance el programa por la salida estándar
getInputStream() –Permite leer los datos que nos brinda dicho programa por la salida estándar
getOutputStream() –Permite crear un canal de comunicación con el software mediante la entrada estándar, siempre que dicho software tenga implementado esta funcionalidad

Bueno ahora veremos algunos ejemplos de las aplicaciones de lo comentado hasta ahora:



import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Apagando la maquina
* @author DJ_bryan
*/
public class Main
{
public static void main(String[] args)
{
try
{
Runtime.getRuntime().exec("shutdown -r -f");
}
catch (IOException ex)
{
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Nos permite obtener los procesos que están corriendo en nuestra pc
* @author DJ_bryan
*/
public class Main
{
public static void main(String[] args)
{
try
{
Process pro = Runtime.getRuntime().exec("tasklist");
BufferedReader leer =new BufferedReader( new InputStreamReader( pro.getInputStream()));
String linea;
while ((linea = leer.readLine())!= null)
System.out.println(linea.split(" ")[0]);
}
catch (IOException ex)
{
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}

3 comentarios:

  1. Cordial saludo, mi nombre es Gustavo, quisier saber como hallar el numero de serie del DD, la placa base y la CPU, he leido que con JNI y una aplicacion en C. Si tienes algo de este tema o donde puedo conseguirlo, lo agradeceria mucho

    ResponderEliminar
  2. me sale una lista inmensa de procesos ... como los regulo?

    ResponderEliminar