最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java根據(jù)URL下載文件到本地的2種方式(大型文件與小型文件)

 更新時(shí)間:2024年01月24日 14:51:47   作者:gzu_01  
這篇文章主要給大家介紹了關(guān)于Java根據(jù)URL下載文件到本地的2種方式,分別是大型文件與小型文件,避免內(nèi)存溢出OOM,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

各位小伙伴是否有使用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)容寫(xiě)入本地文件。

在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)的類(lèi)。

通過(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)容寫(xiě)入輸出流。循環(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)文章

  • VSCode配置java中的lombok解決步驟

    VSCode配置java中的lombok解決步驟

    Lombok是一個(gè)java庫(kù),可自動(dòng)插入您的編輯器和構(gòu)建工具,為您的java增添趣味,這篇文章主要介紹了VSCode配置java中l(wèi)ombok的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-03-03
  • SpringBoot如何使用MyBatisPlus逆向工程自動(dòng)生成代碼

    SpringBoot如何使用MyBatisPlus逆向工程自動(dòng)生成代碼

    本文介紹如何使用SpringBoot、MyBatis-Plus進(jìn)行逆向工程自動(dòng)生成代碼,并結(jié)合Swagger3.0實(shí)現(xiàn)API文檔的自動(dòng)生成和訪(fǎng)問(wèn),通過(guò)詳細(xì)步驟和配置,確保Swagger與SpringBoot版本兼容,并通過(guò)配置文件和測(cè)試類(lèi)實(shí)現(xiàn)代碼生成和Swagger文檔的訪(fǎng)問(wèn)
    2024-12-12
  • java開(kāi)發(fā)模式的深度研究

    java開(kāi)發(fā)模式的深度研究

    下面小編就為大家?guī)?lái)一篇深入理解java工廠模式。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-07-07
  • Spring MVC 更靈活的控制 json 返回問(wèn)題(自定義過(guò)濾字段)

    Spring MVC 更靈活的控制 json 返回問(wèn)題(自定義過(guò)濾字段)

    本篇文章主要介紹了Spring MVC 更靈活的控制 json 返回問(wèn)題(自定義過(guò)濾字段),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • SpringBoot配置圖片訪(fǎng)問(wèn)的虛擬路徑

    SpringBoot配置圖片訪(fǎng)問(wèn)的虛擬路徑

    大家好,本篇文章主要講的是SpringBoot配置圖片訪(fǎng)問(wèn)的虛擬路徑,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下
    2022-02-02
  • Java中三種簡(jiǎn)單注解介紹和代碼實(shí)例

    Java中三種簡(jiǎn)單注解介紹和代碼實(shí)例

    這篇文章主要介紹了Java中三種簡(jiǎn)單注解介紹和代碼實(shí)例,本文講解了Override注解、Deprecated注解、Suppresswarnings注解、元注解等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • 對(duì)Mybatis?Plus中@TableField的使用正解

    對(duì)Mybatis?Plus中@TableField的使用正解

    這篇文章主要介紹了對(duì)Mybatis?Plus中@TableField的使用正解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • JAVA 文件監(jiān)控 WatchService的示例方法

    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)異常的解決

    這篇文章主要介紹了使用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的坑及解決

    這篇文章主要介紹了spring-security關(guān)于hasRole的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評(píng)論

云安县| 名山县| 万山特区| 澎湖县| 姚安县| 晋江市| 饶平县| 长葛市| 商洛市| 辽中县| 北宁市| 新宁县| 宕昌县| 额济纳旗| 井冈山市| 泗阳县| 鹿泉市| 黑河市| 龙游县| 巩义市| 德庆县| 安仁县| 南川市| 桑植县| 辰溪县| 太康县| 武平县| 姜堰市| 乐至县| 朔州市| 台中市| 凤山市| 泰安市| 云霄县| 威远县| 馆陶县| 措勤县| 深圳市| 溧水县| 吴忠市| 新化县|