Cómo descargar un archivo desde una URL en Java

¿Está buscando crear su propio conjunto de datos para una aplicación nueva e innovadora? O tal vez estás tratando de recopilar datos para el análisis de un proyecto universitario y te has cansado de descargar manualmente cada imagen o CSV. No se preocupe, en este artículo explicaré los bloques de construcción necesarios para automatizar la descarga de archivos para este tipo de tareas.
Antes de poder crear una aplicación para descargar y crear conjuntos de datos por usted, deberá conocer los conceptos básicos necesarios para automatizar las descargas de archivos a través del código Java. Obtener los conceptos básicos correctos lo ayudará a usarlos para su propio conjunto de necesidades, ya sea para una aplicación de servidor back-end o una aplicación de Android.
Hay varias formas de descargar un archivo utilizando el código Java. Aquí hay algunas formas de cómo puede realizar la tarea:

Java IO

El paquete más simple y disponible para descargar un archivo de Internet utilizando el código Java es el paquete de IO de Java . Aquí utilizaremos el BufferedInputStreamy las URLclases para abrir y leer un archivo en una dirección dada a un archivo en nuestro sistema local. La razón por la que usamos la BufferedInputStreamclase en lugar de la InputStreames su capacidad de almacenamiento en búfer que le da a nuestro código un aumento de rendimiento.
Antes de profundizar en el aspecto de la codificación, veamos una descripción general de las clases y las funciones individuales que usaremos en el proceso.
La java.net.URLclase en Java es una biblioteca incorporada que ofrece múltiples métodos para acceder y manipular datos en Internet. En este caso, utilizaremos la openStream()función de la URLclase. La firma del método para la openStream()función es:
public final InputStream openStream() throws IOException  
La openStream()función funciona en un objeto de la URLclase. La URLclase abre una conexión a la URL dada y el openStream()método devuelve un flujo de entrada que se utiliza para leer los datos de la conexión.
La segunda clase que usaremos es la BufferedInputStreamReadery la FileOutputStreamEstas clases se utilizan para leer un archivo y escribir en él, respectivamente.
Aquí está el código completo:
try (BufferedInputStream inputStream = new BufferedInputStream(new URL("http://example.com/my-file-path.txt").openStream());  
  FileOutputStream fileOS = new FileOutputStream("/Users/username/Documents/file_name.txt")) {
    byte data[] = new byte[1024];
    int byteContent;
    while ((byteContent = inputStream.read(data, 0, 1024)) != -1) {
        fileOS.write(data, 0, byteContent);
    }
} catch (IOException e) {
    // handles IO exceptions
}
Nota : Es posible que deba agregar el encabezado 'User-Agent' a la solicitud HTTP, ya que algunos servidores no permiten descargas de clientes desconocidos.
Como puede ver, abrimos una conexión utilizando el URLobjeto y luego lo leemos a través del BufferedInputStreamReaderobjeto. Los contenidos se leen como bytes y se copian en un archivo en el directorio local usando el FileOutputStream.
Para reducir el número de líneas de código, podemos usar la Filesclase disponible de Java 7. La Filesclase contiene métodos que leen todos los bytes a la vez y luego los copian en otro archivo. Aquí está cómo puedes usarlo:
InputStream inputStream = new URL("http://example.com/my-file-path.txt").openStream();  
Files.copy(inputStream, Paths.get("/Users/username/Documents/file_name.txt"), StandardCopyOption.REPLACE_EXISTING);  

Java NIO

Java NIO es un paquete alternativo para manejar las operaciones de red y entrada-salida en Java. La principal ventaja que ofrece el paquete Java NIO es que no es de bloqueo y tiene capacidades de canalización y almacenamiento en búfer. Cuando usamos la biblioteca IO de Java, trabajamos con flujos que leen datos byte a byte. Sin embargo, el paquete Java NIO utiliza canales y buffers. Las capacidades de almacenamiento en búfer y canalización permiten que el sistema copie el contenido de una URL directamente en el archivo deseado sin necesidad de guardar los bytes en la memoria de la aplicación, lo que sería un paso intermedio. La capacidad de trabajar con canales aumenta el rendimiento.
Para descargar los contenidos de una URL, usaremos las ReadableByteChannely las FileChannelclases.
ReadableByteChannel readChannel = Channels.newChannel(new URL("http://example.com/my-file-path.txt").openStream());  
La ReadableByteChannelclase crea una secuencia para leer el contenido de la URL. Los contenidos descargados se transferirán a un archivo en el sistema local a través del canal de archivo correspondiente.
FileOutputStream fileOS = new FileOutputStream("/Users/username/Documents/file_name.txt");  
FileChannel writeChannel = fileOS.getChannel();  
Después de definir el canal de archivos, utilizaremos el transferFrom()método para copiar los contenidos leídos del readChannelobjeto al destino del archivo utilizando el writeChannelobjeto.
writeChannel  
  .transferFrom(readChannel, 0, Long.MAX_VALUE);
Los métodos transferFrom()transferTo()son mucho más eficientes que trabajar con flujos utilizando un búfer. Los métodos de transferencia nos permiten copiar directamente el contenido de la caché del sistema de archivos al archivo en el sistema. Por lo tanto, la canalización directa restringe el número de cambios de contexto requeridos y mejora el rendimiento general del código.
Ahora, en las siguientes secciones, buscaremos formas de descargar archivos desde una URL utilizando bibliotecas de terceros en lugar de componentes de funcionalidad Java principales.

Apache Commons IO

La biblioteca de Apache Commons IO ofrece una lista de clases de utilidad para administrar las operaciones de IO. Ahora puede estar pensando por qué usaríamos esto cuando Java tiene su propio conjunto de bibliotecas para manejar las operaciones de E / S. Sin embargo, Apache Commons IO resuelve el problema de la reescritura de código y ayuda a evitar la escritura de código repetitivo.
Para comenzar a utilizar la biblioteca IO de Apache Commons, deberá descargar los archivos jar del sitio web oficial . Cuando haya terminado de descargar los archivos jar, debe agregarlos para usarlos. Si está utilizando un entorno de desarrollo integrado (IDE) como Eclipse , deberá agregar los archivos a la ruta de compilación de su proyecto. Para agregar archivos a su proyecto, deberá hacer clic con el botón derecho sobre él, seleccionar la opción de ruta de acceso de compilación navegando a través de "configurar ruta de compilación -> ruta de compilación", y luego elegir la opción agregar archivos externos.
Para descargar un archivo desde una URL determinada utilizando el IO de Apache Commons, necesitaremos la FileUtilsclase del paquete. Solo se requiere una línea de código para descargar un archivo, que se parece a lo siguiente:
FileUtils.copyURLToFile(  
  new URL("http://example.com/my-file-path.txt"), 
  new File("/Users/username/Documents/file_name.txt"), 
  CONNECTION_TIMEOUT, 
  READ_TIMEOUT);
Los tiempos de espera de conexión y lectura transmiten el tiempo permitido durante el cual la conexión puede permanecer inactiva o la lectura de la URL puede detenerse.
Otra clase del paquete de Apache Commons IO que se puede usar para descargar un archivo a través de Internet es la clase IOUtils . Usaremos el copy(inputStream, fileOS)método para descargar un archivo en el sistema local.
InputStream inputStream = new URL("http://example.com/my-file-path.txt").openStream();  
FileOutputStream fileOS = new FileOutputStream("/Users/username/Documents/file_name.txt");  
int i = IOUtils.copy(inpuStream, fileOS);  
La función devuelve el número de bytes copiados. Si el valor de la variable ies -1, indica que el contenido del archivo es superior a 2GB. Cuando el valor devuelto es -1, puede usar la función copyLarge(inputStream, fileOS)en lugar de la copy(inputstream, fileOS)función para manejar esta carga. Ambas funciones amortiguan inputstreaminternamente. El búfer interno significa que no tenemos que usar la BufferedInputStreamclase para mejorar el rendimiento de nuestro código y nos ayuda a evitar escribir código repetitivo.

Usando los componentes HTTP de Apache

Otra biblioteca administrada por la organización Apache es el paquete HttpComponents . Esta biblioteca utiliza el mecanismo de solicitud y respuesta para descargar el archivo desde una URL determinada.
El primer paso para descargar un archivo es crear un objeto de cliente HTTP que emitiría la solicitud al servidor. Para esto, vamos a utilizar la CloseableHttpClientclase. La CloseableHttpClientclase es una clase abstracta que requiere HttpClientBuilderclase para crear instancias. El fragmento de código que crea un nuevo cliente HTTP es el siguiente:
CloseableHttpClient client = HttpClientBuilder.create().build();  
Entonces necesitamos crear un objeto HttpGetHttpPostpara enviar la solicitud al servidor. La solicitud es creada por la siguiente línea de código:
HttpGet request = new HttpGet("url from where the file is intended to be downloaded");  
La execute(request)función se aplica al objeto cliente y se devuelve con una respuesta del servidor. Una vez que la solicitud se envía al servidor, necesitamos un objeto de respuesta para recibir los datos enviados desde el servidor. Para captar la respuesta del servidor usamos el HttpResponseobjeto class.
HttpResponse response = client.execute(request);  
Los datos enviados por el servidor en forma de mensaje se obtienen a través de la getEntity()función.
HttpEntity entity = response.getEntity();  
También puede obtener el código de respuesta enviado por el servidor a través del responseobjeto y utilizarlo para su necesidad específica.
int responseCode = response.getStatusLine().getStatusCode();  
Los datos que se descargarán se encapsulan dentro del entityobjeto y se pueden extraer mediante la getContent()función. La getContent()función devuelve un InputStreamobjeto que se puede utilizar con más detalle BufferedInputStreamReaderpara mejorar el rendimiento.
InputStream inputStream = entity.getContent();  
Ahora todo lo que necesita hacer es leer el byte de byte a byte y escribir el contenido en un archivo usando la FileOutputStreamclase.
String fileName = "D:\\Demo\file.txt";  
FileOutputStream fos = new FileOutputStream(filename);  
Int byte;  
while((byte = inputStream.read()) != -1) {  
    fos.write(byte);
}
Lo último que debe hacerse es cerrar todos los recursos abiertos para garantizar que los recursos del sistema no se utilicen en exceso y que no haya pérdidas de memoria.

Conclusión

Ahí lo tienen, estas son las formas más simples de descargar un archivo utilizando el código Java básico y otras bibliotecas de terceros. Ahora que hemos terminado con lo básico, puede ser tan creativo como quiera y utilizar el conocimiento para satisfacer sus necesidades. Entonces, nos vemos la próxima vez con un nuevo conjunto de conceptos para ayudarlo a convertirse en un mejor programador. Le deseamos una feliz codificación hasta entonces.

Acerca de: Programator

Somos Instinto Programador

0 comentarios:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

Con tecnología de Blogger.