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!
La Policía Boliviana lanza su propia aplicación móvil que está destinada para denunciar hechos de corrupción dentro de l[...]
El Viaje Astral del Tata Quispe, así titula un nuevo juego boliviano desarrollado por la empresa VReality el cual esta i[...]
Las imagenes SVG (Scalable Vector Graphics) (Ver Wikipedia) son un tipo de imagen ya bastante antiguo pero poco conocido[...]
Gson es una biblioteca de código abierto para Java desarrollado por Google Inc que permite la serialización y deserializ[...]
Segunda parte del tutorial «Crea un servicio web REST con PHP y MYSQL«, en esta segunda y ultima parte se completara la[...]
En ocasiones debemos insertar varios registros a nuestra base de datos desde nuestra aplicación java y lo que usualmente[...]