亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

各位小伙伴是否有使用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)文章

  • idea中如何配置tomcat

    idea中如何配置tomcat

    這篇文章主要介紹了idea中如何配置tomcat問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • springboot整合H2內(nèi)存數(shù)據(jù)庫實現(xiàn)單元測試與數(shù)據(jù)庫無關(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-01
  • JavaMail與Spring整合過程解析

    JavaMail與Spring整合過程解析

    這篇文章主要介紹了JavaMail與Spring整合過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • SpringBoot注解@ConditionalOnClass底層源碼實現(xiàn)

    SpringBoot注解@ConditionalOnClass底層源碼實現(xiàn)

    這篇文章主要為大家介紹了SpringBoot注解@ConditionalOnClass底層源碼實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • 基于SpringAI+DeepSeek實現(xiàn)流式對話功能

    基于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文件的問題

    這篇文章主要介紹了解決Java 部署Tomcat時使用jni和jna調(diào)用DLL文件的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Java基本語法筆記(菜鳥必看篇)

    Java基本語法筆記(菜鳥必看篇)

    下面小編就為大家?guī)硪黄狫ava基本語法筆記(菜鳥必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Java的動態(tài)代理模式之Cglib代理詳解

    Java的動態(tài)代理模式之Cglib代理詳解

    這篇文章主要介紹了Java的動態(tài)代理模式之Cglib代理詳解,Cglib代理也叫作?子類代理,它是在內(nèi)存中構(gòu)建一個子類對象從而實現(xiàn)對目標(biāo)對象功能擴(kuò)展,?有些書也將Cglib代理歸屬到動態(tài)代理,需要的朋友可以參考下
    2023-11-11
  • Java實現(xiàn)的爬蟲抓取圖片并保存操作示例

    Java實現(xiàn)的爬蟲抓取圖片并保存操作示例

    這篇文章主要介紹了Java實現(xiàn)的爬蟲抓取圖片并保存操作,涉及Java針對頁面URL訪問、獲取、字符串匹配、文件下載等相關(guān)操作技巧,需要的朋友可以參考下
    2018-08-08
  • 淺談servlet中的request與response

    淺談servlet中的request與response

    下面小編就為大家?guī)硪黄獪\談servlet中的request與response。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參加。一起跟隨小編過來看看吧
    2016-07-07

最新評論