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!
Todo producto tecnológico tiene un ciclo de vida, algunos bastante corto otros muy largo, podemos mencionar el software[...]
A continuación dejo a consideración 4 entornos de desarrollo visual para Arduino todos gratuitos y de código abierto. Si[...]
En este tutorial Android Bolivia 🙂 construiremos una sencilla aplicación para realizar llamadas por teléfono, aprenderem[...]
Para quienes hayan trabajado con JMF saben que es una librería de Java desarrollada por Sun Microsystems para facilitar[...]
Esta aplicacion permite escalar una imagen desde java sin perder las proporciones de la misma, utiliza SCALE_AREA_AVERAG[...]
La Policía Boliviana lanza su propia aplicación móvil que está destinada para denunciar hechos de corrupción dentro de l[...]