Descargar ficheros web con Java

De ChuWiki

Vamos a ver en este artículo un pequeño ejemplo de cómo bajarnos un fichero web (de internet) con un programita en java.

La clase básica para esto es URL. Con ella indicamos la dirección web del fichero y establecemos la conexión.

import java.net.URL;
import java.net.URLConnection;
...
try {
   URL url = new URL("http://mas.lne.es/fotos/img/2007/10/62/203093470447035b9bc5a095.43783284-foto_verano.jpg");
   URLConnection urlCon = url.openConnection();
   ...
} catch (Exception e) {
   ...
}

Si no sabemos el tipo de fichero que tiene el enlace, podemos preguntarle a la clase URLConnection. Desde luego, el tipo de fichero es totalmente anecdótico, puesto que el método aquí expuesto vale para cualquier tipo de fichero, incluidos los html. En el fondo, independientemente de su tipo, un fichero no es más que un montón de bytes.

// Esto saca por pantalla "image/jpeg"
System.out.println(urlCon.getContentType());

Para acceder al contenido y descargarlo en un fichero local, pedimos a URLConnection el getInputStream() y lo vamos leyendo y escribiendo en un fichero local hasta el final

// acceso al contenido web
InputStream is = urlCon.getInputStream();

// Fichero en el que queremos guardar el contenido
FileOutputStream fos = new FileOutputStream("e:/foto.jpg");

// buffer para ir leyendo.
byte [] array = new byte[1000];

// Primera lectura y bucle hasta el final
int leido = is.read(array);
while (leido > 0) {
   fos.write(array,0,leido);
   leido=is.read(array);
}

// Cierre de conexion y fichero.
is.close();
fos.close();

y por si acaso a alguien le interesa, aquí el ejemplo completo.

package com.chuidiang.ejemplos;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

/**
 * Ejemplo de descarga de un fichero de imagen desde la web.
 * 
 * @author chuidiang
 * 
 */
public class Prueba {

	/**
	 * Descarga un fichero jpeg y lo guarda en e:/foto.jpg
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			// Url con la foto
			URL url = new URL(
					"http://mas.lne.es/fotos/img/2007/10/62/203093470447035b9bc5a095.43783284-foto_verano.jpg");

			// establecemos conexion
			URLConnection urlCon = url.openConnection();

			// Sacamos por pantalla el tipo de fichero
			System.out.println(urlCon.getContentType());

			// Se obtiene el inputStream de la foto web y se abre el fichero
			// local.
			InputStream is = urlCon.getInputStream();
			FileOutputStream fos = new FileOutputStream("e:/foto.jpg");

			// Lectura de la foto de la web y escritura en fichero local
			byte[] array = new byte[1000]; // buffer temporal de lectura.
			int leido = is.read(array);
			while (leido > 0) {
				fos.write(array, 0, leido);
				leido = is.read(array);
			}

			// cierre de conexion y fichero.
			is.close();
			fos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}