Abrir archivos de cualquier tipo desde Java

En esta ocasión voy a tocar un tema que desde mi punto de vista es muy interesante, se trata de cómo abrir archivos de cualquier tipo desde Java. Si tienes algo de experiencia en el tema, sabrás que existe una manera de hacerlo ejecutando un comando de consola desde Java, o incluso con el comando Runtime.getRuntime().exec(rutaArchivo), sin embargo, a partir de Java 6 tenemos la clase java.awt.Desktop que nos permite interactuar con las aplicaciones preferidas del sistema operativo.
Lo que podemos realizar al utilizar esta clase es lo siguiente:
  • Abrir una dirección web en el navegador web por defecto.
  • Abrir el cliente de correo por defecto con datos específicos de un correo saliente como el destinatario, mensaje, cc, etc.
  • Abrir, editar o imprimir algún archivo por medio de su aplicación configurada para dicha acción por defecto.

Se me ocurre por ejemplo que después de que el cliente corra la aplicación que desarrollamos por primera vez le mande a nuestro sitio en internet, o incluso colocar la ayuda de la misma en un servidor web, etc.

Debemos tomar en cuenta que en ocasiones tenemos una aplicación configurada para abrir los archivos y alguna otra para editarlos, por ejemplo, puede ser que las imágenes las veamos en Picasa y las editemos con Photoshop o algo por el estilo.

Teniendo claro la función de la clase java.awt.Desktop pasemos a un ejemplo de su utilización.

Aplicación EjemploClaseDesktop.jar creado en NetBeans 6.1

En primera instancia creé un nuevo proyecto con el nombre EjemploClaseDesktop.jar y agregué un nuevo JFrame, posteriormente agregué paneles, campos de texto, botones y radio botones de manera que quedara de la siguiente manera:


Una vez creado el JFrame, agregué las siguientes variables globales:

Desktop d; //Para realizar los procedimientos
File archivo; //Para almacenar el archivo a abrir, editar o imprimir

y al constructor se le agregó el siguiente código...


/*Establece el título de la ventana*/
setTitle("Ejemplo java.awt.Desktop");
/*Posiciona la ventana en el centro de la pantalla*/
setLocationRelativeTo(null);
setVisible(true);
        
/*Obtiene una instancia del escritorio*/
d = Desktop.getDesktop();

/*Verifica que el ambiente del SO soporte los procedimientos*/
if(d.isDesktopSupported()){
   /*si es así habilita los campos*/
   habilitarCampos(true);
}else{
   /*de lo contrario muestra un error e inhabilita los campos*/
   JOptionPane.showMessageDialog(this, "El sistema no soporta los procedimientos.", "Error", JOptionPane.ERROR_MESSAGE);
   habilitarCampos(false);
}



En el código anterior se puede notar que antes de realizar cualquier procedimiento es recomendable verificar si el ambiente actual soporta los procedimientos a realizar (esto a través del método isDesktopSupported()), de ser así se habilitan los campos contenidos en la ventana.

Navegación web::
Una vez hecho lo anterior agregamos el evento al botón Ir del panel Web y escribimos el siguiente código:

     /*si no se ha escrito nada en el campo de texto*/
if(txweb.getText().equals("")){
   JOptionPane.showMessageDialog(this, "No has escrito una dirección", "Error", JOptionPane.ERROR_MESSAGE);
   txweb.requestFocusInWindow();
   return;
}
try {
    d.browse(new URI(txweb.getText()));
} catch (Exception ex) {
   JOptionPane.showMessageDialog(this, "Error al verificar la dirección.", "Error", JOptionPane.ERROR_MESSAGE);
   return;
}

El método browse(URI) nos permite abrir el navegador web por defecto en el sistema operativo en la dirección indicada por un objeto URI, en este ejemplo es la dirección que se escribe en el campo de texto correspondiente.

Correo electrónico::
Para abrir el cliente de correo por defecto en el sistema con la dirección del destinatario indicada en el campo de texto se utiliza el siguiente código:

String mail = "mailto:"+txemailpara.getText();
try {
    d.mail(new URI(mail));
} catch (Exception ex) {
    Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
}


El método mail(URI) nos permite abrir el cliente de correo por defecto con los datos indicados por el objeto URI, existen muchas maneras de estructurar una dirección URI para correo de manera que podamos pasar el asunto del correo, CC, mensaje y demás, para mayor información te recomiendo darte una vuelta por este sitio.

Apertura, edición e impresión de archivos::
Ahora, para el manejo de archivos tenemos que agregar el evento tanto al botón de Examinar (para escoger el archivo) como al botón de Ok (para realizar la acción), el código del botón Examinar es el siguiente:

JFileChooser fc = new JFileChooser();
int resp = fc.showOpenDialog(this);

if(resp == JFileChooser.APPROVE_OPTION){
    archivo = fc.getSelectedFile();
    txarchivo.setText(archivo.getAbsolutePath());
}


En el código anterior se declara un nuevo objeto de la clase JFileChooser que nos permita navegar por las carpetas y localizar el archivo sobre el cual realizaremos la acción indicada, 
una vez que se selecciona el archivo se almacena en el objeto (de acceso global) tipo File de nombre archivo y se indica su ruta en el campo de texto correspondiente.

Al contar con un archivo sobre el cual trabajar podemos pasar al evento del botón Ok que realiza lo siguiente: 

if(archivo!=null){
    try{
        if(rdAbrir.isSelected()){
           d.open(archivo);
        }
        if(rdEditar.isSelected()){
           d.edit(archivo);
        }
        if(rdImprimir.isSelected()){
            d.print(archivo);
        }   
    }catch(Exception ex){
        JOptionPane.showMessageDialog(this, "Ocurrió un error al realizar la acción.", "Error", JOptionPane.ERROR_MESSAGE);
        return;
    }
}else{
    JOptionPane.showMessageDialog(this, "No has seleccionado el archivo.", "Error", JOptionPane.ERROR_MESSAGE);
    btnExaminar.requestFocusInWindow();
    return;
}


En el código anterior se verifica qué radio botón está seleccionado y se realiza la acción indicada, cabe mencionar que los 3 radio botones pertenecen al mismo grupo (ButtongGroup), el método open() abre el archivo indicado en la aplicación por defecto para dicha acción, edit() abre la aplicación por defecto para editar el archivo y print() imprime el archivo, de igual manera, a través de la aplicación por defecto del sistema.

Esto es todo con respecto a la clase java.awt.Desktop, el proyecto completo de NetBeans puedes descargarlo desde aquí

¿Alguna duda o algo qué decir? Deja tu comentario. Saludox

19 comentarios:

  1. Fernando dijo...:

    Me parece un Excelente artículo, de suma utilidad, muchas gracias. Totalmente recomendable.

  1. Monillo007 dijo...:

    Gracias por tu comentario Fernando. Saludox.

  1. Luis Adolfo dijo...:

    el link para descargarlo no funciona

  1. Anónimo dijo...:

    te dejo mi correo es que tengo una duda sobre esto y necesito que me ayudes porqe estoy haciendo un proyecto gracias

    edwin7-91@hotmail.com

  1. Anónimo dijo...:

    me podrias enviar el programa a mi correo lo necesito.. por favor!!
    tlaco_2390@hotmail.com

  1. Anónimo dijo...:

    disculpa el link no funciona me podrias enviar el programa a mi correo por favor. me urge y gracias
    sakuradarkness@hotmail.com

  1. Anónimo dijo...:

    Me parece interesante tu articulo pero me podrias enviar el programa a mi correo por favor!!
    tonyocampoc@gmail.com

  1. Anónimo dijo...:

    Por favor, necesito que vuelvas a colgar el enlace, estoy haciendo el PFC y me hace falta importar un vídeo. Muchas gracias!!!

  1. Geerson dijo...:

    hola men puedes mandarme el proyecto a mi correo ya no sirve desacargarlo porfavor mi correo es lito_s19@hotmail.com necesito estudiarlo para mi examen parcial de la universidad please

  1. Anónimo dijo...:

    Hola amigo, me puedes enviar el proyecto a mi correo:
    Locoxti_15_15_15@hotmail.com

  1. HectorAnq dijo...:

    Oye amigo me puedes mandar a mi correo hectoranq@gmail.com

  1. Anónimo dijo...:

    Es posible determinar luego de abrir un browser si este fue cerrado usando Desktop?

    Es decir:

    java.awt.Desktop desktop = java.awt.Desktop.getDesktop();
    desktop.browse(java.net.URI.create(this.url));
    Luego quiero que mi aplicación java reaccione cuando se cierra el browser.

    Muchas gracias,

  1. Anónimo dijo...:

    camarada mi correo es anyelius_j-r@hotmail.com pasa el codigo se te agradeceria mucho

  1. Anónimo dijo...:

    Ya logre replicar el ejemplo.

    Solo tengo un detalle. Las variables globales a las que haces referencia:

    Desktop d;
    File archivo;

    En realidad no son globales, son locales a las clases respectivas donde se ocupan.

    Sólo así pude ejecutar tu ejemplo.

    De no ser así, te pediría indiques de que forma las pones para considerarlas globales.

    Mi correo es rusell_villegas@hotmail.com

    Agradecería tu comentario

  1. Anónimo dijo...:

    me podrias enviar el programa a mi correo lo necesito.. por favor!!
    aghuszfersystems@hotmail.com

  1. Anónimo dijo...:

    podrias mandame el archivo pofavor a mi correo:

    strikefreedom1625@yahoo.com

  1. Hola buenas tardes, me harias el favor de enviarme el proyecto a mi correo por que no lo pude bajar desde el enlace mi correo: pmansilla@outlook.com desde ya muchas gracias. Saludos

  1. Hola me puedes enviar el archivo porfavor no funciona el link, mi correo es fabian.dragoonred@gmail.com

  1. Cruz Saucedo dijo...:

    Gracias soy novato y me parece bueno tu artículo,

Publicar un comentario

Este es un espacio abierto, puedes escribir lo que gustes respetando los siguientes puntos:

1.- Lo que escribas esté relacionado con el post, si gustas contactarme puedes hacerlo aqui.

2.- Todo es cuestionable, aunque ten en cuenta que existen formas de hacerlo, evita las agresiones y revisa tu lenguaje antes de publicar un comentario.

3.- Siempre hay tres verdades: tu verdad, mi verdad y la verdad, por lo que opiniones diferentes no necesariamente son equivocadas.

4.- Los comentarios son una forma de discusión abierta, por lo que al publicar uno, implícitamente entras a una discusión, con todo lo que esto representa.

5. Me reservo el derecho de eliminar comentarios que no respeten las condiciones mencionadas anteriormente.

Toma en cuenta que puedes utilizar emoticones en tu comentario, para ver una lista de los disponibles da clic en este enlace.

 
Monillo007 © 2010 | Designed by Trucks, Manual Bookmarking | Elegant Themes