Java根據(jù)URL下載文件到本地的2種方式(大型文件與小型文件)
各位小伙伴是否有使用java,根據(jù)url下載文件到本地的需求,以下介紹兩種方式
1.小型文件推薦使用
代碼解析
首先創(chuàng)建了一個(gè)URL對(duì)象website,用來(lái)表示遠(yuǎn)程文件的地址。
然后創(chuàng)建了一個(gè)ReadableByteChannel對(duì)象rbc和一個(gè)FileOutputStream對(duì)象fos。ReadableByteChannel用于讀取遠(yuǎn)程文件的字節(jié)流,F(xiàn)ileOutputStream用于將讀取的內(nèi)容寫入本地文件。
在try塊中,通過(guò)URL對(duì)象打開一個(gè)連接并獲取其字節(jié)流,然后使用transferFrom方法將遠(yuǎn)程文件的內(nèi)容直接傳輸?shù)奖镜匚募?。這是NIO的一種高效的文件傳輸方式。
如果在上述過(guò)程中發(fā)生異常,將會(huì)捕獲并打印異常信息。
無(wú)論是否發(fā)生異常,最后都會(huì)執(zhí)行finally塊中的清理工作,關(guān)閉文件輸出流和遠(yuǎn)程字節(jié)流通道,以釋放資源。
public static void downloadFile(String remoteFilePath, String localFilePath) { URL website = null; ReadableByteChannel rbc = null; FileOutputStream fos = null; try { website = new URL(remoteFilePath); rbc = Channels.newChannel(website.openStream()); fos = new FileOutputStream(localFilePath);//本地要存儲(chǔ)的文件地址 例如:test.txt fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); } catch (Exception e) { e.printStackTrace(); }finally{ if(fos!=null){ try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } if(rbc!=null){ try { rbc.close(); } catch (IOException e) { e.printStackTrace(); } } } }
2.大型文件推薦使用
代碼解析:
首先創(chuàng)建了一個(gè)URL對(duì)象url,用來(lái)表示要下載文件的地址。
使用URL對(duì)象打開一個(gè)連接,并將其強(qiáng)制轉(zhuǎn)換為HttpURLConnection對(duì)象。HttpURLConnection是Java提供的用于發(fā)送HTTP請(qǐng)求和接收HTTP響應(yīng)的類。
通過(guò)連接獲取輸入流 inputStream,使用BufferedInputStream對(duì)輸入流進(jìn)行緩存。這是為了避免一次性讀取大文件造成內(nèi)存溢出。
創(chuàng)建一個(gè)File對(duì)象 file,表示要保存的本地文件。如果該文件已存在,則刪除之。
創(chuàng)建一個(gè)輸出流 outputStream,將文件作為輸出目標(biāo)。
創(chuàng)建一個(gè)字節(jié)數(shù)組 buffer,大小為5MB(1024 * 1024 * 5),用于緩存每次從輸入流中讀取的數(shù)據(jù)。
使用 while 循環(huán),不斷從輸入流中讀取數(shù)據(jù)到緩沖區(qū),然后將緩沖區(qū)的內(nèi)容寫入輸出流。循環(huán)會(huì)一直進(jìn)行,直到輸入流的末尾。
關(guān)閉連接 connection,并在 finally 塊中關(guān)閉輸入流和輸出流。使用 IOUtils.closeQuietly 方法可以安全地關(guān)閉流,即使發(fā)生異常也不會(huì)拋出異常。
總的來(lái)說(shuō),這段代碼實(shí)現(xiàn)了從指定URL下載文件到本地的功能,并且通過(guò)緩存流和分塊讀取的方式,避免了一次性讀取大文件導(dǎo)致的內(nèi)存溢出問題。同時(shí),在下載完成或出現(xiàn)異常后,也進(jìn)行了資源的關(guān)閉和釋放操作。
public static void downloadFile1(String downloadUrl, String path){ InputStream inputStream = null; OutputStream outputStream = null; try { URL url = new URL(downloadUrl); //這里沒有使用 封裝后的ResponseEntity 就是也是因?yàn)檫@里不適合一次性的拿到結(jié)果,放不下content,會(huì)造成內(nèi)存溢出 HttpURLConnection connection =(HttpURLConnection) url.openConnection(); //使用bufferedInputStream 緩存流的方式來(lái)獲取下載文件,不然大文件會(huì)出現(xiàn)內(nèi)存溢出的情況 inputStream = new BufferedInputStream(connection.getInputStream()); File file = new File(path); if (file.exists()) { file.delete(); } outputStream = new FileOutputStream(file); //這里也很關(guān)鍵每次讀取的大小為5M 不一次性讀取完 byte[] buffer = new byte[1024 * 1024 * 5];// 5MB int len = 0; while ((len = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, len); } connection.disconnect(); }catch (Exception e){ e.printStackTrace(); }finally { IOUtils.closeQuietly(outputStream); IOUtils.closeQuietly(inputStream); } }
總結(jié)
到此這篇關(guān)于Java根據(jù)URL下載文件到本地的2種方式的文章就介紹到這了,更多相關(guān)Java根據(jù)URL下載文件到本地內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot整合H2內(nèi)存數(shù)據(jù)庫(kù)實(shí)現(xiàn)單元測(cè)試與數(shù)據(jù)庫(kù)無(wú)關(guān)性
本篇文章主要介紹了springboot整合H2內(nèi)存數(shù)據(jù)庫(kù)實(shí)現(xiàn)單元測(cè)試與數(shù)據(jù)庫(kù)無(wú)關(guān)性,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01SpringBoot注解@ConditionalOnClass底層源碼實(shí)現(xiàn)
這篇文章主要為大家介紹了SpringBoot注解@ConditionalOnClass底層源碼實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02基于SpringAI+DeepSeek實(shí)現(xiàn)流式對(duì)話功能
一般來(lái)說(shuō)大模型的響應(yīng)速度通常是很慢的,為了避免用戶用戶能夠耐心等待輸出的結(jié)果,我們通常會(huì)使用流式輸出一點(diǎn)點(diǎn)將結(jié)果輸出給用戶,那么問題來(lái)了,想要實(shí)現(xiàn)流式結(jié)果輸出,后端和前端要如何配合?下來(lái)本文給出具體的實(shí)現(xiàn)代碼,需要的朋友可以參考下2025-02-02解決Java 部署Tomcat時(shí)使用jni和jna調(diào)用DLL文件的問題
這篇文章主要介紹了解決Java 部署Tomcat時(shí)使用jni和jna調(diào)用DLL文件的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11Java的動(dòng)態(tài)代理模式之Cglib代理詳解
這篇文章主要介紹了Java的動(dòng)態(tài)代理模式之Cglib代理詳解,Cglib代理也叫作?子類代理,它是在內(nèi)存中構(gòu)建一個(gè)子類對(duì)象從而實(shí)現(xiàn)對(duì)目標(biāo)對(duì)象功能擴(kuò)展,?有些書也將Cglib代理歸屬到動(dòng)態(tài)代理,需要的朋友可以參考下2023-11-11Java實(shí)現(xiàn)的爬蟲抓取圖片并保存操作示例
這篇文章主要介紹了Java實(shí)現(xiàn)的爬蟲抓取圖片并保存操作,涉及Java針對(duì)頁(yè)面URL訪問、獲取、字符串匹配、文件下載等相關(guān)操作技巧,需要的朋友可以參考下2018-08-08