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!
Es recomendable tener actualizado la Maquina Virtual Java de nuestro equipo para poder disfrutar de las mejoras que trae[...]
Programar es un arte y si bien escuchar música no te convertirá en un programador más hábil, estudios han demostrado que[...]
En este post crearemos un swing Label personalizado que tendrá la forma circular en su borde, con esto obtendremos un bo[...]
Cuando se desarrolla aplicaciones por lo general uno no se detiene para agregar algunos efectos visuales que pueden ser[...]
Cuando realizamos un proyecto java utilizando fuentes de nuestro sistema, al momento de distribuir el programa y ejecuta[...]
Problema: Desarrolle un programa en consola con c# para escribir y leer información de un archivo binario. Los datos a e[...]