Java根據(jù)URL下載文件到本地的2種方式(大型文件與小型文件)
各位小伙伴是否有使用java,根據(jù)url下載文件到本地的需求,以下介紹兩種方式
1.小型文件推薦使用
代碼解析
首先創(chuàng)建了一個URL對象website,用來表示遠(yuǎn)程文件的地址。
然后創(chuàng)建了一個ReadableByteChannel對象rbc和一個FileOutputStream對象fos。ReadableByteChannel用于讀取遠(yuǎn)程文件的字節(jié)流,F(xiàn)ileOutputStream用于將讀取的內(nèi)容寫入本地文件。
在try塊中,通過URL對象打開一個連接并獲取其字節(jié)流,然后使用transferFrom方法將遠(yuǎn)程文件的內(nèi)容直接傳輸?shù)奖镜匚募?。這是NIO的一種高效的文件傳輸方式。
如果在上述過程中發(fā)生異常,將會捕獲并打印異常信息。
無論是否發(fā)生異常,最后都會執(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);//本地要存儲的文件地址 例如: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)建了一個URL對象url,用來表示要下載文件的地址。
使用URL對象打開一個連接,并將其強(qiáng)制轉(zhuǎn)換為HttpURLConnection對象。HttpURLConnection是Java提供的用于發(fā)送HTTP請求和接收HTTP響應(yīng)的類。
通過連接獲取輸入流 inputStream,使用BufferedInputStream對輸入流進(jìn)行緩存。這是為了避免一次性讀取大文件造成內(nèi)存溢出。
創(chuàng)建一個File對象 file,表示要保存的本地文件。如果該文件已存在,則刪除之。
創(chuàng)建一個輸出流 outputStream,將文件作為輸出目標(biāo)。
創(chuàng)建一個字節(jié)數(shù)組 buffer,大小為5MB(1024 * 1024 * 5),用于緩存每次從輸入流中讀取的數(shù)據(jù)。
使用 while 循環(huán),不斷從輸入流中讀取數(shù)據(jù)到緩沖區(qū),然后將緩沖區(qū)的內(nèi)容寫入輸出流。循環(huán)會一直進(jìn)行,直到輸入流的末尾。
關(guān)閉連接 connection,并在 finally 塊中關(guān)閉輸入流和輸出流。使用 IOUtils.closeQuietly 方法可以安全地關(guān)閉流,即使發(fā)生異常也不會拋出異常。
總的來說,這段代碼實現(xiàn)了從指定URL下載文件到本地的功能,并且通過緩存流和分塊讀取的方式,避免了一次性讀取大文件導(dǎo)致的內(nèi)存溢出問題。同時,在下載完成或出現(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 就是也是因為這里不適合一次性的拿到結(jié)果,放不下content,會造成內(nèi)存溢出 HttpURLConnection connection =(HttpURLConnection) url.openConnection(); //使用bufferedInputStream 緩存流的方式來獲取下載文件,不然大文件會出現(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot整合H2內(nèi)存數(shù)據(jù)庫實現(xiàn)單元測試與數(shù)據(jù)庫無關(guān)性
本篇文章主要介紹了springboot整合H2內(nèi)存數(shù)據(jù)庫實現(xiàn)單元測試與數(shù)據(jù)庫無關(guān)性,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01SpringBoot注解@ConditionalOnClass底層源碼實現(xiàn)
這篇文章主要為大家介紹了SpringBoot注解@ConditionalOnClass底層源碼實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02基于SpringAI+DeepSeek實現(xiàn)流式對話功能
一般來說大模型的響應(yīng)速度通常是很慢的,為了避免用戶用戶能夠耐心等待輸出的結(jié)果,我們通常會使用流式輸出一點點將結(jié)果輸出給用戶,那么問題來了,想要實現(xiàn)流式結(jié)果輸出,后端和前端要如何配合?下來本文給出具體的實現(xiàn)代碼,需要的朋友可以參考下2025-02-02解決Java 部署Tomcat時使用jni和jna調(diào)用DLL文件的問題
這篇文章主要介紹了解決Java 部署Tomcat時使用jni和jna調(diào)用DLL文件的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11