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!
Las recientes técnicas de traducción profunda de imagen a imagen permiten la generación rápida de imágenes faciales a pa[...]
En este post, aprenderemos como conectar Visual Basic 6 con SQL Server, abrir una tabla, leer su contenido y mostrar est[...]
EL patrón MVC (Model, View, Controller) o Modelo, Vista Controlador, es un tipo de diseño que separa en capas bien defin[...]
En este post veremos una forma de realizar la paginación en una base de datos Access utilizando el lenguaje de programac[...]
En este tuto realizaremos la implementación y ejecución de procedimientos almacenados de MySQL en Java, si quieres darle[...]
Cuando se desarrolla una aplicación, puede ser un requisito que este tenga soporte para varias tipos de base de datos, s[...]