feed twitter facebook LinkedIn facebook

Java » Como descargar un archivo en Java

marzo 21, 2012 por Feffo 7 Comentarios Imprimir Imprimir

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:

  1. String url = "http://i.imgur.com/HZ1hq.jpg"; //dirección url del recurso a descargar
  2. 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.

  1. //Directorio destino para las descargas
  2. String folder = "descargas/";
  3.  
  4. //Crea el directorio de destino en caso de que no exista
  5. File dir = new File(folder);
  6.  
  7. if (!dir.exists())
  8. if (!dir.mkdir())
  9. 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:

  1. Crear el archivo destino.
  2. Establecer la conexión con la url.
  3. Abrir los streams necesarios.
  4. Leer y escribir hasta encontrar el fin del archivo.
  5. Cerrar los streams (¡Importante!).

Creamos el archivo destino, en caso de existir lo elimina:

  1. File file = new File(folder + name);

Establece la conexion con la url mediante una clase URLConnection:

  1. URLConnection conn = new URL(url).openConnection();
  2. conn.connect();
  3. System.out.println("\nempezando descarga: \n");
  4. System.out.println(">> URL: " + url);
  5. System.out.println(">> Nombre: " + name);
  6. System.out.println(">> tamaño: " + conn.getContentLength() + " bytes");

Abrimos los Stream:

  1. InputStream in = conn.getInputStream();

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.

  1. int b = 0;
  2. while (b != -1) {
  3. b = in.read();
  4. if (b != -1)
  5. out.write(b);
  6. }

Cerramos los streams:

  1. out.close();
  2. in.close();

En todo el código de manejo del URLConnection y de los Stream debemos de controlar las excepciones MalformedURLException e IOException.

  1. try {
  2. ...
  3. } catch (MalformedURLException e) {
  4. System.out.println("la url: " + url + " no es valida!");
  5. } catch (IOException e) {
  6. e.printStackTrace();
  7. }

Un poco mas sobre programas auto-actualizables. ¿Cuál es la clave de esto?

  1. Conseguir un servidor (como googlecode) que permita almacenar archivos en una url que no se vea modificada entre cambios.
  2. 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:

  1. 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?

Descargar el Codigo
Descargar el código
Error en el Codigo
Error en el código
Foro sobre Java
Foro sobre Java
tags: , , , , , , , , , , ,

Artículos relacionados:

7 comentarios »

RSS feed para los comentarios de esta entrada. TrackBack URI

  1. Gustavo
    abril 5, 2012 #

    Hola

    Excelente post, me ha funcionado de maravilla. Ahora una pregunta como hago lo contrario a esto, te explico, tengo una sistema web, hecho en .net, y que una de sus funciones es manejar un flujo de documento que se firman electronicamente, entonces tengo un applet que permite firmar los documentos, entonces en el applet descargo el archivo del server, lo firmo (porque la firma es local) pero tengo que desde el mismo applet devolver el archivo firmado al sistema web osea al servidor, me puedes dar una mano por favor.

    Saludos

    Gustavo

  2. Curso de Java
    septiembre 14, 2012 #

    Excelente explicación. Está todo muy claro y funciona sin ningún tipo de problema. Saludos y Gracias.

  3. juan
    febrero 23, 2013 #

    Gracias excelente info :=)

  4. Feffo
    febrero 25, 2013 #

    me alegro que te haya servido :D

  5. Vilma
    mayo 6, 2013 #

    Hola,
    gracias por tu codigo, pero no me lee archivos pdf or .doc
    que puedo hacer para estos casos?

    Gracias

  6. nomada web
    octubre 28, 2013 #

    Hola, salidos. Muy bueno el codigo, pero como haria para descargar un video.. lo he intentado pero no se como hacerlo….. si me puedes ayudar te lo agradezco… Saludos

  7. arthur
    agosto 29, 2014 #

    que tal,,, una duda, servira si le meto una ruta hacia un servidor????

Deja un comentario

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*