En este post veremos un ejemplo sencillo de como descargar desde Internet archivos de cualquier tipo (*.jpg, *.png, *.gif, *.mp4, *.webm, etc) utilizando el lenguaje de programación java y ayudándonos de librerías existentes que nos ahorran bastante tiempo de codificación.
La librería que utilizaremos se llama AsyncHttpClient y es una de las librerías más populares para la ejecución de solicitudes HTTP y procesar sus respuestas de forma asincrónica. La biblioteca también es compatible con el protocolo WebSocket. Está construido sobre Netty. Actualmente está compilado en Java 8, pero también se ejecuta en Java 9 y superior. Licenciado bajo la Licencia Apache, Versión 2.0
Instalación
Maven:
<!-- https://mvnrepository.com/artifact/org.asynchttpclient/async-http-client --> <dependency> <groupId>org.asynchttpclient</groupId> <artifactId>async-http-client</artifactId> <version>2.10.4</version> </dependency>
El archivo a descargar es un GIF animado del personaje de Mr. Bean
![]()
la URL es:
https://thumbs.gfycat.com/TepidLinearCollie-size_restricted.gif
Implementamos el código java para realizar una llamada asíncrona y descarga el archivo
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.concurrent.ExecutionException; import org.asynchttpclient.Dsl; import org.asynchttpclient.AsyncCompletionHandler; import org.asynchttpclient.AsyncHandler; import org.asynchttpclient.AsyncHttpClient; import org.asynchttpclient.HttpResponseBodyPart; import org.asynchttpclient.Response; /** * @see https://www.jc-mouse.net/ * @author mouse */ public class Main { public static void main(String[] args) { try { //archivo a descargar final String ORIGEN = "https://thumbs.gfycat.com/TepidLinearCollie-size_restricted.gif"; //archivo destino final String DESTINO = "archivo_descargado.gif"; FileOutputStream stream = new FileOutputStream(DESTINO); AsyncHttpClient client = Dsl.asyncHttpClient(); AsyncCompletionHandler<FileOutputStream> asyncHandler = new AsyncCompletionHandler<FileOutputStream>() { @Override public AsyncHandler.State onBodyPartReceived(HttpResponseBodyPart bodyPart) throws Exception { System.out.println("onBodyPartReceived LEN:" + bodyPart.length() + " bytes | Ultima parte: " + bodyPart.isLast()); //escribe en archivo parte por parte stream.getChannel().write(bodyPart.getBodyByteBuffer()); return AsyncHandler.State.CONTINUE; } @Override public FileOutputStream onCompleted(Response response) throws Exception { System.out.println("Descarga completa"); return stream; } }; FileOutputStream fos = client.prepareGet(ORIGEN).execute(asyncHandler).get(); fos.close(); } catch (FileNotFoundException ex) { System.err.println(ex.getMessage()); } catch (InterruptedException | ExecutionException | IOException ex) { System.err.println(ex.getMessage()); } } }
En lugar de acumular la descarga en memoria, escribimos directamente los bytes en un archivo local utilizando el método getBodyByteBuffer(), de esta forma evitamos un consumo alto de memoria si el archivo a descargar fuera demasiado grande.
enjoy!
En este tutorial crearemos una aplicación sencilla para activar y desactivar el bluetooth de nuestros teléfonos intelige[...]
En este post crearemos un cliente android para consumir un recurso de un REST API utilizando las librerías GSON y Volley[...]
Una de las novedades de Java 9 y 10 aunque por el momento en modo de prueba (jdk.incubator.http) es el Cliente HTTP el c[...]
Inspeccionando los cientos de marcadores que tenia en mi firefox, me encontre un enlace web con una interesante clase pa[...]
En este tutorial crearemos el botón de Google+ Google Circles para una interfaz de escritorio 🙂 si no sabes lo que son e[...]
Gson es una biblioteca de código abierto para Java desarrollado por Google Inc que permite la serialización y deserializ[...]