with una ruta guardar from example especifica desde descargar codigo archivos archivo java download

una - java download file from server



¿Cómo descargar y guardar un archivo desde Internet usando Java? (20)

Hay un archivo en línea (como http://www.example.com/information.asp ) que necesito para agarrar 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 una manera de simplemente descargar y guardar el archivo utilizando Java?


A continuación se muestra el código de muestra para descargar películas de Internet con el código Java:

URL url = new URL("http://103.66.178.220/ftp/HDD2/Hindi%20Movies/2018/Hichki%202018.mkv"); BufferedInputStream bufferedInputStream = new BufferedInputStream(url.openStream()); FileOutputStream stream = new FileOutputStream("/home/sachin/Desktop/test.mkv"); int count=0; byte[] b1 = new byte[100]; while((count = bufferedInputStream.read(b1)) != -1) { System.out.println("b1:"+b1+">>"+count+ ">> KB downloaded:"+new File("/home/sachin/Desktop/test.mkv").length()/1024); stream.write(b1, 0, count); }


Cuando use Java 7+ use el siguiente método para descargar un archivo de Internet y guardarlo en algún directorio:

private static Path download(String sourceURL, String targetDirectory) throws IOException { URL url = new URL(sourceURL); String fileName = sourceURL.substring(sourceURL.lastIndexOf(''/'') + 1, sourceURL.length()); Path targetPath = new File(targetDirectory + File.separator + fileName).toPath(); Files.copy(url.openStream(), targetPath, StandardCopyOption.REPLACE_EXISTING); return targetPath; }

Documentación here .


Es posible descargar el archivo con HttpComponents de Apache en lugar de Commons-IO . Este código le permite descargar un archivo en Java de acuerdo con su URL y guardarlo en el destino específico.

public static boolean saveFile(URL fileURL, String fileSavePath) { boolean isSucceed = true; CloseableHttpClient httpClient = HttpClients.createDefault(); HttpGet httpGet = new HttpGet(fileURL.toString()); httpGet.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0"); httpGet.addHeader("Referer", "https://www.google.com"); try { CloseableHttpResponse httpResponse = httpClient.execute(httpGet); HttpEntity fileEntity = httpResponse.getEntity(); if (fileEntity != null) { FileUtils.copyInputStreamToFile(fileEntity.getContent(), new File(fileSavePath)); } } catch (IOException e) { isSucceed = false; } httpGet.releaseConnection(); return isSucceed; }

En contraste con la única línea de código:

FileUtils.copyURLToFile(fileURL, new File(fileSavePath), URLS_FETCH_TIMEOUT, URLS_FETCH_TIMEOUT);

este código le dará más control sobre un proceso y le permitirá especificar no solo los tiempos de espera, sino también los valores de User-Agent y Referer , que son críticos para muchos sitios web.


Es una pregunta antigua, pero aquí hay una solución elegante solo para JDK:

public static void download(String url, String fileName) throws Exception { try (InputStream in = URI.create(url).toURL().openStream()) { Files.copy(in, Paths.get(fileName)); } }

Recursos concisos, legibles, bien cerrados que no aprovechan más que el JDK principal y las funciones de idioma.


Esta es otra variante de java7 basada en la respuesta de Brian Risk con el uso de la declaración try-with:

public static void downloadFileFromURL(String urlString, File destination) throws Throwable { URL website = new URL(urlString); try( ReadableByteChannel rbc = Channels.newChannel(website.openStream()); FileOutputStream fos = new FileOutputStream(destination); ){ fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); } }


Esta respuesta es casi exactamente como la respuesta seleccionada, pero con dos mejoras: es un método y cierra el objeto FileOutputStream:

public static void downloadFileFromURL(String urlString, File destination) { try { URL website = new URL(urlString); ReadableByteChannel rbc; rbc = Channels.newChannel(website.openStream()); FileOutputStream fos = new FileOutputStream(destination); fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); fos.close(); rbc.close(); } catch (IOException e) { e.printStackTrace(); } }


Existe el método U.fetch (url) en la biblioteca de underscore-java .

pom.xml:

<groupId>com.github.javadev</groupId> <artifactId>underscore</artifactId> <version>1.36</version>

Ejemplo de código:

import com.github.underscore.lodash.U; public class Download { public static void main(String ... args) { String text = U.fetch("https://.com/questions" + "/921262/how-to-download-and-save-a-file-from-internet-using-java").text(); } }


Hay muchas respuestas elegantes y eficientes aquí. Pero la concisión nos puede hacer perder alguna información útil. En particular, a menudo uno no quiere considerar un error de conexión como una excepción , y uno podría querer tratar de manera diferente algún tipo de errores relacionados con la red, por ejemplo, para decidir si debemos volver a intentar la descarga.

Aquí hay un método que no lanza excepciones para errores de red (solo para problemas verdaderamente excepcionales, como url mal formado o problemas para escribir en el archivo)

/** * Downloads from a (http/https) URL and saves to a file. * Does not consider a connection error an Exception. Instead it returns: * * 0=ok * 1=connection interrupted, timeout (but something was read) * 2=not found (FileNotFoundException) (404) * 3=server error (500...) * 4=could not connect: connection timeout (no internet?) java.net.SocketTimeoutException * 5=could not connect: (server down?) java.net.ConnectException * 6=could not resolve host (bad host, or no internet - no dns) * * @param file File to write. Parent directory will be created if necessary * @param url http/https url to connect * @param secsConnectTimeout Seconds to wait for connection establishment * @param secsReadTimeout Read timeout in seconds - trasmission will abort if it freezes more than this * @return See above * @throws IOException Only if URL is malformed or if could not create the file */ public static int saveUrl(final Path file, final URL url, int secsConnectTimeout, int secsReadTimeout) throws IOException { Files.createDirectories(file.getParent()); // make sure parent dir exists , this can throw exception URLConnection conn = url.openConnection(); // can throw exception if bad url if( secsConnectTimeout > 0 ) conn.setConnectTimeout(secsConnectTimeout * 1000); if( secsReadTimeout > 0 ) conn.setReadTimeout(secsReadTimeout * 1000); int ret = 0; boolean somethingRead = false; try (InputStream is = conn.getInputStream()) { try (BufferedInputStream in = new BufferedInputStream(is); OutputStream fout = Files .newOutputStream(file)) { final byte data[] = new byte[8192]; int count; while((count = in.read(data)) > 0) { somethingRead = true; fout.write(data, 0, count); } } } catch(java.io.IOException e) { int httpcode = 999; try { httpcode = ((HttpURLConnection) conn).getResponseCode(); } catch(Exception ee) {} if( somethingRead && e instanceof java.net.SocketTimeoutException ) ret = 1; else if( e instanceof FileNotFoundException && httpcode >= 400 && httpcode < 500 ) ret = 2; else if( httpcode >= 400 && httpcode < 600 ) ret = 3; else if( e instanceof java.net.SocketTimeoutException ) ret = 4; else if( e instanceof java.net.ConnectException ) ret = 5; else if( e instanceof java.net.UnknownHostException ) ret = 6; else throw e; } return ret; }


Hay un problema con el uso simple de:

org.apache.commons.io.FileUtils.copyURLToFile(URL, File)

si necesita descargar y guardar archivos muy grandes, o en general si necesita reintentos automáticos en caso de que la conexión se interrumpa.

Lo que sugiero en tales casos es Apache HttpClient junto con org.apache.commons.io.FileUtils. Por ejemplo:

GetMethod method = new GetMethod(resource_url); try { int statusCode = client.executeMethod(method); if (statusCode != HttpStatus.SC_OK) { logger.error("Get method failed: " + method.getStatusLine()); } org.apache.commons.io.FileUtils.copyInputStreamToFile( method.getResponseBodyAsStream(), new File(resource_file)); } catch (HttpException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { method.releaseConnection(); }


La descarga de un archivo requiere que lo lea, de cualquier forma tendrá que revisar el archivo de alguna manera. En lugar de línea por línea, simplemente puede leerlo por bytes de la secuencia:

BufferedInputStream in = new BufferedInputStream(new URL("http://www.website.com/information.asp").openStream()) byte data[] = new byte[1024]; int count; while((count = in.read(data,0,1024)) != -1) { out.write(data, 0, count); }


Para resumir (y de alguna manera pulir y actualizar) las respuestas anteriores. Los tres métodos siguientes son prácticamente equivalentes. (Agregué tiempos de espera explícitos porque creo que son obligatorios, nadie quiere que la descarga se congele para siempre cuando se pierde la conexión).

public static void saveUrl1(final Path file, final URL url, int secsConnectTimeout, int secsReadTimeout)) throws MalformedURLException, IOException { // Files.createDirectories(file.getParent()); // optional, make sure parent dir exists try (BufferedInputStream in = new BufferedInputStream( streamFromUrl(url, secsConnectTimeout,secsReadTimeout) ); OutputStream fout = Files.newOutputStream(file)) { final byte data[] = new byte[8192]; int count; while((count = in.read(data)) > 0) fout.write(data, 0, count); } } public static void saveUrl2(final Path file, final URL url, int secsConnectTimeout, int secsReadTimeout)) throws MalformedURLException, IOException { // Files.createDirectories(file.getParent()); // optional, make sure parent dir exists try (ReadableByteChannel rbc = Channels.newChannel( streamFromUrl(url, secsConnectTimeout,secsReadTimeout) ); FileChannel channel = FileChannel.open(file, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE) ) { channel.transferFrom(rbc, 0, Long.MAX_VALUE); } } public static void saveUrl3(final Path file, final URL url, int secsConnectTimeout, int secsReadTimeout)) throws MalformedURLException, IOException { // Files.createDirectories(file.getParent()); // optional, make sure parent dir exists try (InputStream in = streamFromUrl(url, secsConnectTimeout,secsReadTimeout) ) { Files.copy(in, file, StandardCopyOption.REPLACE_EXISTING); } } public static InputStream streamFromUrl(URL url,int secsConnectTimeout,int secsReadTimeout) throws IOException { URLConnection conn = url.openConnection(); if(secsConnectTimeout>0) conn.setConnectTimeout(secsConnectTimeout*1000); if(secsReadTimeout>0) conn.setReadTimeout(secsReadTimeout*1000); return conn.getInputStream(); }

No encuentro diferencias significativas, todo me parece correcto. Son seguros y eficientes. (Las diferencias en la velocidad parecen no ser relevantes. Escribo 180Mb desde el servidor local a un disco SSD en tiempos que fluctúan entre 1.2 y 1.5 segs). No requieren bibliotecas externas. Todos trabajan con tamaños arbitrarios y (según mi experiencia) redirecciones HTTP.

Además, todos lanzan la FileNotFoundException si no se encuentra el recurso (error 404, normalmente), y java.net.UnknownHostException si la resolución del DNS falló; otras IOException corresponden a errores durante la transmisión.

(Marcado como wiki de la comunidad, siéntase libre de agregar información o correcciones)


Personalmente, he descubierto que el HttpClient de Apache es más que capaz de todo lo que tenía que hacer con respecto a esto. Here hay un gran tutorial sobre cómo usar HttpClient


Prueba Java NIO :

URL website = new URL("http://www.website.com/information.asp"); ReadableByteChannel rbc = Channels.newChannel(website.openStream()); FileOutputStream fos = new FileOutputStream("information.html"); fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);

Usar transferFrom() es potencialmente mucho más eficiente que un simple bucle que lee desde el canal de origen y escribe en este canal. Muchos sistemas operativos pueden transferir bytes directamente desde el canal de origen a la memoria caché del sistema de archivos sin copiarlos realmente.

Compruebe más sobre esto here .

Nota : El tercer parámetro en transferFrom es el número máximo de bytes a transferir. Integer.MAX_VALUE se transferirá a lo sumo 2 ^ 31 bytes, Long.MAX_VALUE permitirá a lo más 2 ^ 63 bytes (más grande que cualquier archivo existente).


Puedes hacer esto en 1 línea usando netloader para Java :

new NetFile(new File("my/zips/1.zip"), "https://example.com/example.zip", -1).load(); //returns true if succeed, otherwise false.


Si está detrás de un proxy, puede configurar los proxies en el programa java de la siguiente manera:

Properties systemSettings = System.getProperties(); systemSettings.put("proxySet", "true"); systemSettings.put("https.proxyHost", "https proxy of your org"); systemSettings.put("https.proxyPort", "8080");

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.

public static void main(String[] args) throws IOException { String url="https://raw.githubusercontent.com/bpjoshi/fxservice/master/src/test/java/com/bpjoshi/fxservice/api/TradeControllerTest.java"; OutputStream outStream=null; URLConnection connection=null; InputStream is=null; File targetFile=null; URL server=null; //Setting up proxies Properties systemSettings = System.getProperties(); systemSettings.put("proxySet", "true"); systemSettings.put("https.proxyHost", "https proxy of my organisation"); systemSettings.put("https.proxyPort", "8080"); //The same way we could also set proxy for http System.setProperty("java.net.useSystemProxies", "true"); //code to fetch file try { server=new URL(url); connection = server.openConnection(); is = connection.getInputStream(); byte[] buffer = new byte[is.available()]; is.read(buffer); targetFile = new File("src/main/resources/targetFile.java"); outStream = new FileOutputStream(targetFile); outStream.write(buffer); } catch (MalformedURLException e) { System.out.println("THE URL IS NOT CORRECT "); e.printStackTrace(); } catch (IOException e) { System.out.println("Io exception"); e.printStackTrace(); } finally{ if(outStream!=null) outStream.close(); } }


Use apache commons-io , solo un código de línea:

FileUtils.copyURLToFile(URL, File)


Uso más simple de nio:

URL website = new URL("http://www.website.com/information.asp"); try (InputStream in = website.openStream()) { Files.copy(in, target, StandardCopyOption.REPLACE_EXISTING); }


import java.io.*; import java.net.*; public class filedown { public static void download(String address, String localFileName) { OutputStream out = null; URLConnection conn = null; InputStream in = null; try { URL url = new URL(address); out = new BufferedOutputStream(new FileOutputStream(localFileName)); conn = url.openConnection(); in = conn.getInputStream(); byte[] buffer = new byte[1024]; int numRead; long numWritten = 0; while ((numRead = in.read(buffer)) != -1) { out.write(buffer, 0, numRead); numWritten += numRead; } System.out.println(localFileName + "/t" + numWritten); } catch (Exception exception) { exception.printStackTrace(); } finally { try { if (in != null) { in.close(); } if (out != null) { out.close(); } } catch (IOException ioe) { } } } public static void download(String address) { int lastSlashIndex = address.lastIndexOf(''/''); if (lastSlashIndex >= 0 && lastSlashIndex < address.length() - 1) { download(address, (new URL(address)).getFile()); } else { System.err.println("Could not figure out local file name for "+address); } } public static void main(String[] args) { for (int i = 0; i < args.length; i++) { download(args[i]); } } }


public class DownloadManager { static String urls = "[WEBSITE NAME]"; public static void main(String[] args) throws IOException{ URL url = verify(urls); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); InputStream in = null; String filename = url.getFile(); filename = filename.substring(filename.lastIndexOf(''/'') + 1); FileOutputStream out = new FileOutputStream("C://Java2_programiranje/Network/DownloadTest1/Project/Output" + File.separator + filename); in = connection.getInputStream(); int read = -1; byte[] buffer = new byte[4096]; while((read = in.read(buffer)) != -1){ out.write(buffer, 0, read); System.out.println("[SYSTEM/INFO]: Downloading file..."); } in.close(); out.close(); System.out.println("[SYSTEM/INFO]: File Downloaded!"); } private static URL verify(String url){ if(!url.toLowerCase().startsWith("http://")) { return null; } URL verifyUrl = null; try{ verifyUrl = new URL(url); }catch(Exception e){ e.printStackTrace(); } return verifyUrl; } }


public void saveUrl(final String filename, final String urlString) throws MalformedURLException, IOException { BufferedInputStream in = null; FileOutputStream fout = null; try { in = new BufferedInputStream(new URL(urlString).openStream()); fout = new FileOutputStream(filename); final byte data[] = new byte[1024]; int count; while ((count = in.read(data, 0, 1024)) != -1) { fout.write(data, 0, count); } } finally { if (in != null) { in.close(); } if (fout != null) { fout.close(); } } }

Tendrá que manejar las excepciones, probablemente externas a este método.