Hay un archivo en línea (como http://www.example.com/information.asp
) que necesito tomar y guardar en un directorio. Sé que hay varios métodos para capturar y leer archivos en línea (URL) línea por línea, pero ¿hay alguna manera de descargar y guardar el archivo usando Java?
425
Respuestas:
Prueba Java NIO :
El uso
transferFrom()
es potencialmente mucho más eficiente que un simple ciclo que lee del canal fuente y escribe en este canal. Muchos sistemas operativos pueden transferir bytes directamente desde el canal de origen al caché del sistema de archivos sin copiarlos realmente.Mira más sobre esto aquí .
Nota : El tercer parámetro en transferFrom es el número máximo de bytes para transferir.
Integer.MAX_VALUE
transferirá como máximo 2 ^ 31 bytes,Long.MAX_VALUE
permitirá como máximo 2 ^ 63 bytes (más grande que cualquier archivo existente).fuente
8388608
TB?transferFrom()
isnt 'especificado para completar la transferencia completa en una sola llamada. Por eso devuelve un recuento. Tienes que hacer un bucle.URL::openStream()
devuelve solo una secuencia regular, lo que significa que todo el tráfico todavía se está copiando a través de matrices de bytes Java [] en lugar de permanecer en búferes nativos. Solofos.getChannel()
es en realidad un canal nativo, por lo que la sobrecarga permanece completa. Eso es cero ganancias al usar NIO en este caso. Además de estar roto, como EJP y Ben MacCann notaron correctamente.Use apache commons-io , solo un código de línea:
fuente
copyURLToFile
parámetro con tiempo de espera solo está disponible desde la versión 2.0 de la biblioteca Commons IO. Ver documentos JavaUso más simple de nio:
fuente
InputStream.read()
devolver cero a menos que haya proporcionado un búfer o conteo de longitud cero, 'pequeña pausa' o de otra manera. Se bloqueará hasta que se haya transferido al menos un byte o al final de la transmisión o se produzca un error. Su reclamo sobre losFiles.copy()
aspectos internos de no tiene fundamento.Deberá manejar excepciones, probablemente externas a este método.
fuente
in.close
arroja una excepción,fout.close
no se llama.BufferedInputStream
tiene un efecto precisamente cero en los tiempos de espera de socket. Ya lo había refutado como 'mito urbano' en mis comentarios a los 'detalles de fondo' que usted citó. Tres años antes.BufferedInputStream
"puede causar fallas impredecibles").Es una pregunta antigua, pero aquí hay una solución concisa, legible, solo JDK con recursos debidamente cerrados:
Dos líneas de código y sin dependencias.
fuente
import java.io.InputStream; import java.net.URI; import java.nio.file.Files; import java.nio.file.Paths;
La descarga de un archivo requiere que lo lea, de cualquier manera tendrá que revisar el archivo de alguna manera. En lugar de línea por línea, puede leerlo por bytes de la secuencia:
fuente
Cuando utilice,
Java 7+
utilice el siguiente método para descargar un archivo de Internet y guardarlo en algún directorio:Documentación aquí .
fuente
Esta respuesta es casi exactamente como la respuesta seleccionada pero con dos mejoras: es un método y cierra el objeto FileOutputStream:
fuente
transferFrom()
isnt 'especificado para completar la transferencia completa en una sola llamada. Por eso devuelve un recuento. Tienes que hacer un bucle.fuente
in.close
arroja una excepción,out.close
no se llama.Personalmente, he encontrado que el HttpClient de Apache es más que capaz de todo lo que necesito hacer con respecto a esto. Aquí hay un gran tutorial sobre el uso de HttpClient
fuente
Esta es otra variante de java7 basada en la respuesta de Brian Risk con el uso de la declaración try-with:
fuente
transferFrom()
isnt 'especificado para completar la transferencia completa en una sola llamada. Por eso devuelve un recuento. Tienes que hacer un bucle.Es posible descargar el archivo con Apache en
HttpComponents
lugar deCommons-IO
. Este código le permite descargar un archivo en Java de acuerdo con su URL y guardarlo en el destino específico.En contraste con la única línea de código:
este código le dará más control sobre un proceso y permitirá especificar no sólo los tiempos de espera, pero
User-Agent
yReferer
los valores, que son fundamentales para muchos sitios web.fuente
Hay muchas respuestas elegantes y eficientes aquí. Pero la concisión puede hacernos perder información útil. En particular, a menudo no se quiere considerar un error de conexión como una Excepción , y se puede tratar de manera diferente algún tipo de error relacionado con la red, por ejemplo, para decidir si debemos volver a intentar la descarga.
Aquí hay un método que no arroja Excepciones para errores de red (solo para problemas verdaderamente excepcionales, como URL malformada o problemas para escribir en el archivo)
fuente
A continuación se muestra el código de muestra para descargar películas de internet con código java:
fuente
Hay un problema con el uso simple de:
si necesita descargar y guardar archivos muy grandes, o en general si necesita reintentos automáticos en caso de que se corte la conexión.
Lo que sugiero en tales casos es Apache HttpClient junto con org.apache.commons.io.FileUtils. Por ejemplo:
fuente
Para resumir (y de alguna manera pulir y actualizar) respuestas anteriores. Los tres métodos siguientes son prácticamente equivalentes. (Agregué tiempos de espera explícitos porque creo que son imprescindibles, nadie quiere que una descarga se congele para siempre cuando se pierde la conexión).
No encuentro diferencias significativas, todo me parece correcto. Son seguros y eficientes. (Las diferencias de velocidad parecen poco relevantes: escribo 180 Mb desde el servidor local en un disco SSD en tiempos que fluctúan alrededor de 1.2 a 1.5 segs). No requieren bibliotecas externas. Todos funcionan con tamaños arbitrarios y (según mi experiencia) redirecciones HTTP.
Además, todos se lanzan
FileNotFoundException
si no se encuentra el recurso (error 404, por lo general) yjava.net.UnknownHostException
si falla la resolución de DNS; otras IOException corresponden a errores durante la transmisión.(Marcado como wiki de la comunidad, siéntase libre de agregar información o correcciones)
fuente
Hay un método U.fetch (url) en la biblioteca de subrayado-java .
pom.xml:
Ejemplo de código:
fuente
Java
, pero su mirada como respuestaJavaScript
fuente
Puede hacer esto en 1 línea usando netloader para Java :
fuente
Si está detrás de un proxy, puede configurar los proxies en el programa java de la siguiente manera:
Si no está detrás de un proxy, no incluya las líneas anteriores en su código. Código de trabajo completo para descargar un archivo cuando está detrás de un proxy.
fuente
1er método usando el nuevo canal
Segundo método usando FileUtils
3er método usando
Así es como podemos descargar el archivo utilizando el código básico de Java y otras bibliotecas de terceros. Estos son solo para referencia rápida. Busque en Google las palabras clave anteriores para obtener información detallada y otras opciones.
fuente