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á tratando de recopilar datos para el análisis de un proyecto universitario y se ha cansado de descargar manualmente cada imagen o CSV. No se preocupe, en este artículo explicaré los componentes básicos necesarios para automatizar la descarga de archivos para este tipo de tareas.

    Antes de que pueda crear una aplicación para descargar y crear conjuntos de datos para usted, necesitará conocer los conceptos básicos necesarios para automatizar las descargas de archivos a través del código Java. Tener los conceptos básicos correctos lo ayudará a usarlos para su propio conjunto específico de necesidades, ya sea para una aplicación de servidor backend o una aplicación de Android.

    Hay varias formas de descargar un archivo utilizando código Java. Estas son solo algunas formas de cómo puede realizar la tarea:

    Java IO

    El paquete básico y más fácilmente disponible para descargar un archivo de Internet usando código Java es el Java IO paquete. Aquí usaremos el BufferedInputStream y el URL clases 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 el BufferedInputStream clase en lugar de la InputStream es su capacidad de almacenamiento en búfer lo que le da a nuestro código un aumento de rendimiento.

    Antes de profundizar en el aspecto de la codificación, echemos un vistazo a las clases y las funciones individuales que usaremos en el proceso.

    Te puede interesar:Cómo copiar un archivo en Java

    los java.net.URL class en Java es una biblioteca incorporada que ofrece múltiples métodos para acceder y manipular datos en Internet. En este caso, usaremos el openStream() función de la URL clase. La firma del método para el openStream() la función es:

    public final InputStream openStream() throws IOException
    

    los openStream() La función trabaja en un objeto del URL clase. los URL clase abre una conexión a la URL dada y el openStream() El método devuelve un flujo de entrada que se utiliza para leer datos de la conexión.

    La segunda clase que usaremos es la BufferedInputStreamReader y el FileOutputStream. Estas clases se utilizan para leer de un archivo y escribir en él, respectivamente.

    Aquí está el código completo:

    try (BufferedInputStream inputStream = new BufferedInputStream(new URL("https://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.

    Te puede interesar:Métodos de objetos de Java: esperar y notificar

    Como puede ver, abrimos una conexión usando el URL objeto y luego leerlo a través del BufferedInputStreamReader objeto. Los contenidos se leen como bytes y se copian a un archivo en el directorio local usando el FileOutputStream.

    Para reducir el número de líneas de código podemos usar el Files clase disponible en Java 7. La Files La clase contiene métodos que leen todos los bytes a la vez y luego los copian en otro archivo. Así es como puede usarlo:

    InputStream inputStream = new URL("https://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 operaciones de entrada y salida de redes y en Java. La principal ventaja de que Java NIO que ofrece el paquete es que no es bloqueante y tiene capacidades de canalización y almacenamiento en búfer. Cuando usamos la biblioteca Java IO, trabajamos con flujos que leen datos byte a byte. Sin embargo, el paquete Java NIO utiliza canales y búferes. 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 mejora el rendimiento.

    Para descargar el contenido de una URL, usaremos el ReadableByteChannel y el FileChannel clases.

    ReadableByteChannel readChannel = Channels.newChannel(new URL("https://example.com/my-file-path.txt").openStream());
    

    los ReadableByteChannel La clase crea una secuencia para leer el contenido de la URL. El contenido descargado se transferirá a un archivo en el sistema local a través del canal de archivo correspondiente.

    Te puede interesar:Tutorial de Dropwizard: Desarrolle servicios web RESTful más rápido
    FileOutputStream fileOS = new FileOutputStream("/Users/username/Documents/file_name.txt");
    FileChannel writeChannel = fileOS.getChannel();
    

    Después de definir el canal de archivo usaremos el transferFrom() método para copiar el contenido leído de la readChannel objeto al destino del archivo utilizando el writeChannel objeto.

    writeChannel
      .transferFrom(readChannel, 0, Long.MAX_VALUE);
    

    los transferFrom() y transferTo() Los métodos son mucho más eficientes que trabajar con flujos usando un búfer. Los métodos de transferencia nos permiten copiar directamente el contenido de la caché del sistema de archivos al archivo del sistema. Por tanto, la canalización directa restringe el número de cambios de contexto necesarios 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 los componentes básicos de la funcionalidad de Java.

    Apache Commons IO

    los Apache Commons IO La biblioteca ofrece una lista de clases de servicios públicos para administrar las operaciones de E / S. 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 supera el problema de la reescritura de código y ayuda a evitar escribir código repetitivo.

    Para comenzar a usar la biblioteca de IO de Apache Commons, deberá descargar los archivos jar de la página 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, debe hacer clic derecho sobre él, seleccionar la opción de ruta 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.

    Te puede interesar:Cómo convertir una cadena en fecha en Java

    Para descargar un archivo de una URL dada usando Apache Commons IO, necesitaremos el FileUtils clase del paquete. Solo se requiere una línea de código para descargar un archivo, que se ve así:

    FileUtils.copyURLToFile(
      new URL("https://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 IO de Apache Commons que se puede utilizar para descargar un archivo a través de Internet es el IOUtils clase. Usaremos el copy(inputStream, fileOS) método para descargar un archivo en el sistema local.

    InputStream inputStream = new URL("https://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 i es -1, indica que el contenido del archivo supera los 2 GB. Cuando el valor devuelto es -1, puede usar la función copyLarge(inputStream, fileOS) en lugar del copy(inputstream, fileOS) función para manejar esta carga. Ambas funciones almacenan el inputstream internamente. El búfer interno significa que no tenemos que usar el BufferedInputStream class para mejorar el rendimiento de nuestro código y nos ayuda a evitar escribir código repetitivo.

    Uso de componentes HTTP de Apache

    Otra biblioteca administrada por la organización Apache es la HttpComponents paquete. Esta biblioteca utiliza el mecanismo de solicitud-respuesta para descargar el archivo desde una URL determinada.

    Te puede interesar:Leer y escribir JSON en Java

    El primer paso para descargar un archivo es crear un objeto de cliente HTTP que emita la solicitud al servidor. Para esto, usaremos el CloseableHttpClient clase. los CloseableHttpClient class es una clase abstracta que requiere HttpClientBuilder clase 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 HttpGet o HttpPost objeto para enviar la solicitud al servidor. La solicitud se crea mediante la siguiente línea de código:

    HttpGet request = new HttpGet("url from where the file is intended to be downloaded");
    

    los execute(request) La función se aplica al objeto del cliente y regresa con una respuesta del servidor. Una vez que se envía la solicitud al servidor, necesitamos un objeto de respuesta para recibir los datos enviados desde el servidor. Para captar la respuesta del servidor usamos el HttpResponse objeto de clase.

    HttpResponse response = client.execute(request);
    

    Los datos enviados por el servidor en forma de mensaje se obtienen a través del getEntity() función.

    HttpEntity entity = response.getEntity();
    

    También puede obtener el código de respuesta enviado por el servidor a través del response objeto y úselo según sus necesidades específicas.

    Te puede interesar:Manejo de Excepciones en Java: Una guía completa con las mejores y peores prácticas
    int responseCode = response.getStatusLine().getStatusCode();
    

    Los datos que se descargarán se encapsulan dentro del entity objeto y se puede extraer utilizando el getContent() función. los getContent() función devuelve un InputStream objeto que se puede utilizar más con un BufferedInputStreamReader para mejorar el rendimiento.

    InputStream inputStream = entity.getContent();
    

    Ahora todo lo que necesita hacer es leer de la secuencia byte a byte y escribir el contenido en un archivo usando el FileOutputStream clase.

    String fileName = "D:\Demofile.txt";
    FileOutputStream fos = new FileOutputStream(filename);
    Int byte;
    while((byte = inputStream.read()) != -1) {
        fos.write(byte);
    }
    

    Lo último que se debe hacer es cerrar todos los recursos abiertos para garantizar que los recursos del sistema no se sobreutilicen y que no haya pérdidas de memoria.

    Conclusión

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

     

    Rate this post

    Etiquetas: