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ì)象打開(kāi)一個(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ì)象打開(kāi)一個(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)存溢出問(wèn)題。同時(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);
//這里沒(méi)有使用 封裝后的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如何使用MyBatisPlus逆向工程自動(dòng)生成代碼
本文介紹如何使用SpringBoot、MyBatis-Plus進(jìn)行逆向工程自動(dòng)生成代碼,并結(jié)合Swagger3.0實(shí)現(xiàn)API文檔的自動(dòng)生成和訪問(wèn),通過(guò)詳細(xì)步驟和配置,確保Swagger與SpringBoot版本兼容,并通過(guò)配置文件和測(cè)試類實(shí)現(xiàn)代碼生成和Swagger文檔的訪問(wèn)2024-12-12
Spring MVC 更靈活的控制 json 返回問(wèn)題(自定義過(guò)濾字段)
本篇文章主要介紹了Spring MVC 更靈活的控制 json 返回問(wèn)題(自定義過(guò)濾字段),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02
對(duì)Mybatis?Plus中@TableField的使用正解
這篇文章主要介紹了對(duì)Mybatis?Plus中@TableField的使用正解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
JAVA 文件監(jiān)控 WatchService的示例方法
本篇文章主要介紹了JAVA 文件監(jiān)控 WatchService的示例方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
使用IDEA啟動(dòng)項(xiàng)目build時(shí)出現(xiàn)OOM相關(guān)異常的解決
這篇文章主要介紹了使用IDEA啟動(dòng)項(xiàng)目build時(shí)出現(xiàn)OOM相關(guān)異常的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-06-06
spring-security關(guān)于hasRole的坑及解決
這篇文章主要介紹了spring-security關(guān)于hasRole的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09

