viernes, 8 de noviembre de 2013

Gestor de Descargas en Java

Un saludo a todos los seguidores de mi blog. En esta oportunidad vamos a desarrollar un gestor de descargas muy básico pero aprenderemos un poco sobre el manejo de hilos. Para comprender un poco el funcionamiento de estos programas, utilizados en navegadores, es que vamos a crear un ejemplo sencillo en donde le ingresemos una URL asociada a un archivo y luego elegir la ruta donde este se guardará, de tal manera que podamos visualizar cómo poco a poco este archivo se va descargando, mediante una barra de progreso.

El primer paso es conocer cómo podemos acceder a un recurso de Internet mediante su URL. Para esto vamos a usar las clases URLConnection e InputStream. Mediante el uso de estas clases podemos obtener información del recurso o archivo al que queremos acceder de la manera en como la muestro a continuación:
URL url = new URL(direccion);
// establecemos conexion
URLConnection conexion= url.openConnection();
InputStream stream = conexion.getInputStream();
int length = conexion.getContentLength();
También debemos tener en cuenta que al descargar un archivo, debemos tener la capacidad de poder pausar la descarga, cancelarla o visualizar el porcentaje de avance. Esto nos sugiere que la descarga debe ser gestionada por un proceso a parte, es decir debemos ejecutarla en background por un hilo o Thread. Y es justamente esta última la que nos permitirá implementar esta funcionalidad, pues como sabemos, Java ya cuenta con dos clases. Para desarrollar esto simplemente debemos crear una clase que implemente la interfaz Runnable y escribir la implementación del método run, tal como lo muestro a continuación:
/**
 *
 * @author Rolando
 */
public class Gestor implements Runnable {

    public void run() {
    }

}
Este clase será la encargada de ubicar el archivo, calcular su tamaño, ir mostrando el progreso de la descarga y escribir el recurso o fichero en nuestro disco local una vez terminada la descarga. Para poder medir el porcentaje de avance de la descarga usamos el componente JProgresBar estableciendo las propiedades de éste de la siguiente manera:
int length = conexion.getContentLength();
gui.getjProgressBar1().setMinimum(0);
gui.getjProgressBar1().setMaximum(length);
gui.getjProgressBar1().setValue(0);
La descarga del recurso desde la nube y su posterior almacenamiento en nuestro disco duro local se hará de la siguiente manera:
FileOutputStream fichero = new FileOutputStream(rutaDescarga);
// Lectura de la foto de la web y escritura en fichero local
byte[] buffer = new byte[1024]; // buffer temporal de lectura.
int readed = stream.read(buffer);
int current = 0;
while (readed > 0) {
   fichero.write(buffer, 0, readed);
   readed = stream.read(buffer);
   parent.getPgrAvance().setValue(current);
   current += readed;
}
parent.getPgrAvance().setValue(length);
Entonces, consolidando todos los segmentos de código mostrados anteriormente tenemos la clase encargada de la descarga de la siguiente manera:
package com.rolandopalermo.blog;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import javax.swing.JOptionPane;

/**
 *
 * @author Rolando
 */
public class Gestor implements Runnable {

    private String direccion;
    private String rutaDescarga;
    private VentanaPrincipal parent;

    public Gestor(String direccion, String rutaDescarga, VentanaPrincipal parent) {
        this.direccion = direccion;
        this.rutaDescarga = rutaDescarga;
        this.parent = parent;
    }

    @Override
    public void run() {
        try {
            URL url = new URL(direccion);
            // establecemos conexion
            URLConnection conexion = url.openConnection();
            InputStream stream = conexion.getInputStream();
            int length = conexion.getContentLength();
            parent.getPgrAvance().setString("");
            parent.getPgrAvance().setMinimum(0);
            parent.getPgrAvance().setMaximum(length);
            parent.getPgrAvance().setValue(0);
            FileOutputStream fichero = new FileOutputStream(rutaDescarga);
            // Lectura de la foto de la web y escritura en fichero local
            byte[] buffer = new byte[1024]; // buffer temporal de lectura.
            int readed = stream.read(buffer);
            int current = 0;
            while (readed > 0) {
                fichero.write(buffer, 0, readed);
                readed = stream.read(buffer);
                parent.getPgrAvance().setValue(current);
                current += readed;
            }
            parent.getPgrAvance().setValue(length);
            parent.getPgrAvance().setString("Descarga completa");
            // cierre de conexion y fichero.
            stream.close();
            fichero.close();
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(parent, ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
        }
    }
}
Y para finalizar, aquí les dejo el código fuente para que lo puedan revisar.

Descargar

Saludos a todos y espero que les sea de utilidad. Y no se olviden de seguir este blog a través de su página en Facebook.

1 comentarios:

Mons dijo...

hola amigo que tal, prodrias poner una imagen de como queda el gestor para poder hacer la interfaz y asi poder implementarle el codigo. gracias

Publicar un comentario