¿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 Javalos 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 notificarComo 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.
Te puede interesar:Cómo convertir una cadena en fecha en JavaPara 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 JavaEl 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.