欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實現(xiàn)http請求文件流對帶寬限速獲取md5值

 更新時間:2025年02月28日 09:45:14   作者:曲奇hmb  
文章介紹了如何在進行HTTP請求下載大數(shù)據(jù)時處理帶寬限制和并發(fā)問題,通過使用緩沖區(qū)和限速邏輯,可以有效控制下載速度,避免掉包和數(shù)據(jù)丟失,核心公式基于帶寬和已下載字節(jié)數(shù)計算預期耗時,并通過Thread.sleep()進行動態(tài)休眠補償,感興趣的朋友一起看看吧

場景:

當進行http請求獲取大數(shù)據(jù)的情況,例如下載視頻圖片的情況,特別是云服務器會有帶寬限制,超出帶寬會出現(xiàn)掉包丟數(shù)據(jù)的情況,例如:云服務器限制25m/s的速度,當一個視頻下載超過25m/s的速度的時候就會導致掉包,除了限速還需要注意下并發(fā)問題,多個線程同時下載也會超出帶寬限制,可實現(xiàn)該代碼并設置單獨的線程池,控制同時并發(fā)的線程數(shù)來解決帶寬問題.

邏輯:

我們可以使用一個緩沖區(qū),每次從輸入流讀取數(shù)據(jù)后,先將寫入文件的同時更新MD5,這樣更高效,因為只需要處理一次數(shù)據(jù)。這樣就不會增加額外的讀取次數(shù),避免影響性能。然后,帶寬限流的邏輯需要確保在限流的同時處理這兩個操作。每次讀取數(shù)據(jù)塊后,會計算總字節(jié)數(shù)和時間,判斷是否需要暫停(使用Thread.sleep())。計算MD5的消耗應該相對較小,主要的時間還是在網(wǎng)絡讀取和文件寫入上。

1. 核心公式

限速邏輯基于以下公式實現(xiàn):

預期耗時(ms)=已下載總字節(jié)數(shù)×1000最大允許帶寬(B/s)預期耗時(ms)=最大允許帶寬(B/s)已下載總字節(jié)數(shù)×1000?

其中 MAX_BPS = NMB/s = N × 1024 × 1024 B/s

2. 控制邏輯分步說明

步驟代碼片段說明
1. 記錄開始時間long startTime = System.currentTimeMillis();下載任務啟動時記錄初始時間戳
2. 累計下載量totalBytes += bytesRead;每次讀取數(shù)據(jù)塊后更新總字節(jié)數(shù)
3. 計算理論耗時expectedTime = (totalBytes * 1000) / MAX_BPS根據(jù)當前下載量計算理論應耗時
4. 對比實際耗時elapsed = now - startTime獲取實際已耗時
5. 動態(tài)休眠補償Thread.sleep(expectedTime - elapsed)強制等待至理論時間線

流程:

1. 打開網(wǎng)絡連接,獲取輸入流。

2. 創(chuàng)建文件輸出流和MessageDigest實例。

3. 循環(huán)讀取數(shù)據(jù)到緩沖區(qū),每次讀取后寫入文件,更新MD5(MD5可以邊讀取文件邊計算,防止整個文件讀取完再計算導致的內(nèi)存壓力),并進行限流計算。

4. 下載完成后,關(guān)閉流,并輸出MD5結(jié)果。

實現(xiàn):

 
public static String getMd5(String url, String type) {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        final long MAX_BPS = 2 * 1024 * 1024; // 200Mbps = 25MB/s
        MessageDigest md;
        // 創(chuàng)建時間格式化器(線程安全)
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
        try {
            md = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("MD5 algorithm not found", e);
        }
        try (CloseableHttpResponse response = httpClient.execute(new HttpGet(url))) {
            HttpEntity entity = response.getEntity();
            if (entity == null) {
                return "";
            }
            // 記錄開始時間
            long startTime = System.currentTimeMillis();
            try (InputStream in = entity.getContent()) {
                byte[] buffer = new byte[8192];
                int bytesRead;
                long totalBytes = 0;
                while ((bytesRead = in.read(buffer)) != -1) {
                    md.update(buffer, 0, bytesRead);
                    totalBytes += bytesRead;
                    // 動態(tài)限速邏輯
                    long elapsed = System.currentTimeMillis() - startTime;
                    long expectedTime = (totalBytes * 1000) / MAX_BPS;
                    if (elapsed < expectedTime) {
                        Thread.sleep(expectedTime - elapsed);
                    }
                }
                // 計算最終統(tǒng)計信息
                long endTime = System.currentTimeMillis();
                double timeCost = DoubleUtils.formatDouble((endTime - startTime) / 1000.0);
                String sizeMB = String.format("%.3f", DoubleUtils.formatDouble(totalBytes / (1024.0 * 1024)));
                // 生成MD5
                String md5 = DatatypeConverter.printHexBinary(md.digest()).toLowerCase();
                // 完整日志輸出
                log.info("下載完成 | 類型: {} | MD5: {} | 大小: {}MB | 耗時: {}s",
                        type, md5, sizeMB, timeCost);
                return md5;
            }
        } catch (Exception e) {
            // 記錄異常發(fā)生時間
            String errorTime = LocalDateTime.now().format(formatter);
            log.error("下載失敗 | 類型: {} | 錯誤時間: {} | 原因: {}",
                    type, errorTime, e.getMessage());
            return "";
        }finally {
            try {
                httpClient.close();
            }catch (Exception e) {
            }
        }
    }

到此這篇關(guān)于Java實現(xiàn)http請求文件流對帶寬限速獲取md5值的文章就介紹到這了,更多相關(guān)java帶寬限速獲取md5值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MyBatis?Generator?ORM層面的代碼自動生成器(推薦)

    MyBatis?Generator?ORM層面的代碼自動生成器(推薦)

    Mybatis?Generator是一個專門為?MyBatis和?ibatis框架使用者提供的代碼生成器,也可以快速的根據(jù)數(shù)據(jù)表生成對應的pojo類、Mapper接口、Mapper文件,甚至生成QBC風格的查詢對象,這篇文章主要介紹了MyBatis?Generator?ORM層面的代碼自動生成器,需要的朋友可以參考下
    2023-01-01
  • 最全總結(jié)SpringBean的作用域管理

    最全總結(jié)SpringBean的作用域管理

    今天給大家詳細總結(jié)了SpringBean的作用域管理,文中有非常詳細的圖文介紹以及代碼示例,對正在學習java的小伙伴們還很有幫助,需要的朋友可以參考下
    2021-05-05
  • 10k+點贊的 SpringBoot 后臺管理系統(tǒng)教程詳解

    10k+點贊的 SpringBoot 后臺管理系統(tǒng)教程詳解

    這篇文章主要介紹了10k+點贊的 SpringBoot 后臺管理系統(tǒng)教程詳解,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • SpringCloud-Gateway轉(zhuǎn)發(fā)WebSocket失敗問題及解決

    SpringCloud-Gateway轉(zhuǎn)發(fā)WebSocket失敗問題及解決

    這篇文章主要介紹了SpringCloud-Gateway轉(zhuǎn)發(fā)WebSocket失敗問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 適用于Java初學者的學習路線圖

    適用于Java初學者的學習路線圖

    這篇文章主要介紹了學習Java的路線圖的五個必經(jīng)階段,還有一些作者的想法分享給大家,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • 兼容Spring Boot 1.x和2.x配置類參數(shù)綁定的工具類SpringBootBindUtil

    兼容Spring Boot 1.x和2.x配置類參數(shù)綁定的工具類SpringBootBindUtil

    今天小編就為大家分享一篇關(guān)于兼容Spring Boot 1.x和2.x配置類參數(shù)綁定的工具類SpringBootBindUtil,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • 4個Java8中你需要知道的函數(shù)式接口分享

    4個Java8中你需要知道的函數(shù)式接口分享

    Java?8?中提供了許多函數(shù)式接口,包括Function、Consumer、Supplier、Predicate?等等。本文主要來和大家介紹一下它們的具體使用,需要的可以參考一下
    2023-04-04
  • 基于java springboot + mybatis實現(xiàn)電影售票管理系統(tǒng)

    基于java springboot + mybatis實現(xiàn)電影售票管理系統(tǒng)

    這篇文章主要介紹了基于java springboot + mybatis實現(xiàn)的完整電影售票管理系統(tǒng)基于java springboot + mybatis,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • SpringBoot整合Security實現(xiàn)權(quán)限控制框架(案例詳解)

    SpringBoot整合Security實現(xiàn)權(quán)限控制框架(案例詳解)

    Spring Security是一個能夠為基于Spring的企業(yè)應用系統(tǒng)提供聲明式的安全訪問控制解決方案的安全框,是一個重量級的安全管理框架,本文給大家介紹的非常詳細,需要的朋友參考下吧
    2021-08-08
  • JavaWEB中Servlet的生命周期詳解

    JavaWEB中Servlet的生命周期詳解

    大家好,本篇文章主要講的是JavaWEB中Servlet的生命周期詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01

最新評論