Como descargar un archivo en Java

21/mar/2012 Java , , , , , , 9 Comentarios
java

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?

Vídeos sobre Java

Difunde el Conocimiento

Si te ha gustado el artículo o te ha sido de utilidad, no dejes de compartirlo con tus amigos en las redes sociales... Te estaremos muy agradecidos. :-D

9 comentarios en “Como descargar un archivo en Java”

Feffo

Emmanuel

Oye, una pregunta, ahí utilizaste try y catch y algunas librerías verdad ??
Si es así podrías decirme las librerías que usaste y donde va el try y catch ??

Feffo

martinono

Gracias, el codigo funciona bien, lo he probado con .txt ,png,jpg,pdf, doc, y por lo que veo casi con todo jeje hasta el momento no me ha fallado.

Feffo

arthur

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

Feffo

nomada web

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

Feffo

Vilma

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

Gracias

Feffo

Feffo

me alegro que te haya servido 😀

Feffo

juan

Gracias excelente info :=)

Feffo

Curso de Java

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

Feffo

Gustavo

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

¿Algo que nos quieras comentar?

Déjanos tu comentario, no te preocupes que tu email no será publicado

*


*