lunes, 17 de enero de 2011

Lanzar Aplicaciones del SO desde Java (Abrir Archivos con su Aplicación Asociada)


Una herramienta muy útil a la hora de desarrollar aplicaciones en java es el uso de programas externos para complementar la experiencia del usuario y simplificar el trabajo del programador, por ejemplo durante mis años en la universidad he tenido que generar una considerable cantidad de reportes en html, y las primeras veces, yo mismo creaba un mini web browser dentro de mi aplicación para poder ver el reporte, en vez de utilizar el navegador del sistema operativo lo cual resulta mucho mas cómodo y familiar para el usuario.

este post muestra como abrir cualquier archivo con su aplicación asociada, es decir por ejemplo con un archivo ".txt" normalmente se abrirá con notepad como que el usuario le hubiera dado doble click, si es un ".mp3" se va a lanzar el reproductor que el usuario tenga configurado como principal, y así cualquier extensión que tenga asociado algún programa, podrá ser lanzado con este pequeño trozo de código.

esta solución es especifica de Windows, ya que depende del shell "cmd.exe" para ejecutar un comando propio del sistema operativo "start" para lanzar los archivos con sus aplicaciones asociadas, no es muy complicado encontrar el equivalente en Linux, tratare de publicar la versión para Linux muy pronto.

basicamente el programa ejecuta desde java el siguiente comando

cmd.exe /C start "tituloDeLaVentana" "pathDelArchivoQueDeseamosAbrir"

el parámetro /C le dice a cmd.exe que ejecute lo que sigue a continuación, y el resultado es "start path", si nosotros a mano abrimos la linea de comandos y ejecutamos, "start path" para algún archivo y presionamos enter, vamos a observar el resultado del comando.


el método importante es el siguiente


public static void abrirArchivoConSO( String pPath ) {
        
        try {
            
            
            String[] cmd = new String[5];
            // interprete de comandos de windows, cmd.exe 
            cmd[0] = "cmd"; 
            
            // 1er parametro /C le indica a cmd que ejecute el comando a continuacion
            cmd[1] = "/C";  
            
            // 2do parametro start es el programa que abre cualquier archivo
            // con su programa asociado
            cmd[2] = "start";             
            // por ejemplo, si en una consola escribimos,
            // start uno.txt se abre notepad con el archivo abierto. 
            
            cmd[3] = "\"\""; // titulo de la ventana
            
            cmd[4] = "\"" + pPath + "\""; // path del archivo que deseamos abrir
            
            Runtime rt = Runtime.getRuntime();

            rt.exec(cmd);
            
        } catch (Exception e) {
            // TODO: Add catch code
            e.printStackTrace();
        }        
        
    }


ademas adjunto un ejemplo que crea un archivo .txt y un .html en la carpeta temporal, y los lanza, en mi computadora esto resulta en una ventana de notepad abierta, y una nueva pestaña de chrome.

ejemplo actualizado para aceptar "path" que incluyen espacios en blanco, gracias al comentario de "KON-E"
Descargar Codigo Fuente de Ejemplo