Como mi primera colaboración en Linea de Codigo les voy a presentar una forma muy simple para poder descargar cualquier archivo desde Java. :)
Sin duda, es una solución simple a un problema relativamente recurrente, pero que con un poco de maña pueden hacer algo muy poderoso, y quizás hasta profesional, como lo es un programa Auto-Actualizable.
(Abajo del todo les cuento un poco sobre mi experiencia sobre este tema.)
Pero primero es lo primero, y para empezar vamos a necesitar los siguientes elementos Java para realizar una descarga.
Estos son:
String url = "http://i.imgur.com/HZ1hq.jpg"; //dirección url del recurso a descargar
String name = "lineadecodigo.jpg"; //nombre del archivo destino
Por cuestiones de prolijidad y organización está bueno que los archivos sean destinados a una carpeta especial encargada de almacenarlos, en vez de que anden dando vueltas por ahí.
Lo siguiente que debemos hacer en nuestro programa Java es crear la carpeta destino, si es que esta no existe. En caso de no poder crearla el programa se abortará, ya que si no puede crear una carpeta, es muy probable que tampoco pueda crear el archivo destino de la descarga.
//Directorio destino para las descargas
String folder = "descargas/";
//Crea el directorio de destino en caso de que no exista
File dir = new File(folder);
if (!dir.exists())
if (!dir.mkdir())
return; // no se pudo crear la carpeta de destino
Por como esta planteado, si ya existía un archivo con el mismo nombre que el archivo destino, este va a ser reemplazado, con el uso del metodo public boolean exists() se puede solucionar.
Además, tengan en cuenta que el método public boolean renameTo(File dest) no funciona bien en Windows, siempre retornara false y nunca hará su cometido. Esto lo digo por si quieren usar archivos con un nombre temporal, puede que tengan problemas a la hora de renombrarlo.
Una vez hecho esto estamos en condiciones de empezar la descarga del archivo elegido en Java.
Esto se realiza de la siguiente forma:
- Crear el archivo destino.
- Establecer la conexión con la url.
- Abrir los streams necesarios.
- Leer y escribir hasta encontrar el fin del archivo.
- Cerrar los streams (¡Importante!).
Creamos el archivo destino, en caso de existir lo elimina:
File file = new File(folder + name);
Establece la conexion con la url mediante una clase URLConnection:
URLConnection conn = new URL(url).openConnection();
conn.connect();
System.out.println("\nempezando descarga: \n");
System.out.println(">> URL: " + url);
System.out.println(">> Nombre: " + name);
System.out.println(">> tamaño: " + conn.getContentLength() + " bytes");
Abrimos los Stream:
InputStream in = conn.getInputStream();
OutputStream out = new FileOutputStream(file);
Mediante un bucle vamos leyendo del InputStream y vamos escribiendo en el OutputStream. Vamos leyendo de a un byte por vez y los escribe en un archivo. El -1 significa que se llego al final.
int b = 0;
while (b != -1) {
b = in.read();
if (b != -1)
out.write(b);
}
Cerramos los streams:
out.close();
in.close();
En todo el código de manejo del URLConnection y de los Stream debemos de controlar las excepciones MalformedURLException e IOException.
try {
...
} catch (MalformedURLException e) {
System.out.println("la url: " + url + " no es valida!");
} catch (IOException e) {
e.printStackTrace();
}
Un poco mas sobre programas auto-actualizables. ¿Cuál es la clave de esto?
- Conseguir un servidor (como googlecode) que permita almacenar archivos en una url que no se vea modificada entre cambios.
- Una forma de versionado, por mas simple que sea, para poder reconocer si hay versiones nuevas o no.
De esta forma, podrían almacenar en un txt una lista de direcciones url correspondientes a los archivos que deben ser actualizados. Entonces, descargan ese txt, luego lo recorren como a cualquier archivo y por cada url que encuentre en él, inicien una descarga. Finalmente, reemplazan esos archivos con sus predecesores y mediante un dialogo le piden al usuario que reinicie el programa y luego lo cierran con:
System.exit (0);
O algo por el estilo.
Esto, sinceramente, les va a solucionar muchos problemas en cuanto a tiempo, ya que pueden actualizar sus programas directamente desde la comodidad de su casa.
¿Se les ocurre alguna otra utilidad? ¿Le harían alguna modificación al código Java?