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.

    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.

    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.

    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.

    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.

    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.

    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.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *