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

Java斷點續(xù)傳(文件分塊)完整實現(xiàn)步驟

 更新時間:2025年05月22日 10:14:25   作者:破曉*  
這篇文章主要介紹了Java斷點續(xù)傳(文件分塊)完整實現(xiàn)步驟,?斷點續(xù)傳通過分塊傳輸大文件,中斷后可續(xù)傳未完成部分,服務端合并分塊,避免重復上傳,提升用戶體驗并節(jié)省網(wǎng)絡資源,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

什么是斷點續(xù)傳?

引用百度百科:對斷點續(xù)傳的定義

個人理解:如果我們要在項目的媒資管理部分,上傳視頻文件(通常這類視頻文件都比較大),http協(xié)議本身對上傳文件大小沒有限制,但是客戶的網(wǎng)絡環(huán)境質(zhì)量,電腦硬件環(huán)境參差不齊,可能會導致一個大文件快上傳完了出現(xiàn)斷網(wǎng)的情況,從而導致文件沒有上傳成功,需要客戶重新上傳,用戶體驗非常差,所以對于大文件上傳的要求是能做到 斷點續(xù)傳

斷點續(xù)傳流程圖如下圖:

簡要概述實現(xiàn)步驟:

  • 前端上傳完先把文件分成塊
  • 一塊一塊的上傳,上傳中斷后重新上傳,已上傳的分塊則不用再上傳
  • 各分塊上傳完成最后在服務端合并文件

(為了方便理解,我用Java代碼的方法 測試文件的分塊與合并)

先進行大文件資源 分塊操作:

1.導入一系列的包

package com.xuecheng.media;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.IOUtils;
import org.junit.jupiter.api.Test;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.*;

導入多個外部和Java自帶的庫,其中org.apache.commons.codec.digest.DigestUtils:用于生成文章的摘要,能夠在斷點續(xù)傳中驗證文件的完整性

2.定義相關的類和方法

public class BigFileTest {
    //測試文件分塊方法
    @Test
    public void testChunk() throws IOException {

定義一個公共類BigFileTest,用于包含文件處理相關的測試方法,并且定義了一個testChunk方法,該方法用于執(zhí)行文件分塊操作,并聲明了可能拋出IOException異常,因為文件操作可能會失敗

3.創(chuàng)建分塊文件

File sourceFile = new File("d:/develop/bigfile_test/nacos.mp4");
String chunkPath = "d:/develop/bigfile_test/chunk/";
File chunkFolder = new File(chunkPath);
if (!chunkFolder.exists()) {
    chunkFolder.mkdirs();
}

創(chuàng)建一個File對象,表示要對d:/develop/bigfile_test/路徑下的nacos.mp4源文件進行分塊,并創(chuàng)建一個File對象,表示分塊存儲的文件夾,如果分塊文件夾不存在,則創(chuàng)建它

 4.對大文件分成文件塊

//分塊大小
long chunkSize = 1024 * 1024 * 1;
//分塊數(shù)量
long chunkNum = (long) Math.ceil(sourceFile.length() * 1.0 / chunkSize);
System.out.println("分塊總數(shù):" + chunkNum);

然后對 文件進行分割,定義每個分塊的大小,通過源文件的長度除以分塊大?。ㄒ捎孟蛏先≌蓿┦褂肕ath.ceil方法向上取整,計算出分塊的總數(shù)

5.進行對文件的讀取寫入

//緩沖區(qū)大小
byte[] b = new byte[1024];
//使用RandomAccessFile訪問文件
RandomAccessFile raf_read = new RandomAccessFile(sourceFile, "r");
//分塊
for (int i = 0; i < chunkNum; i++) {
    //創(chuàng)建分塊文件
    File file = new File(chunkPath + i);
    if (file.exists()) {
        file.delete();
    }
    boolean newFile = file.createNewFile();
    if (newFile) {
        //向分塊文件中寫數(shù)據(jù)
        RandomAccessFile raf_write = new RandomAccessFile(file, "rw");
        int len = -1;
        while ((len = raf_read.read(b))!= -1) {
            raf_write.write(b, 0, len);
            if (file.length() >= chunkSize) {
                break;
            }
        }
        raf_write.close();
        System.out.println("完成分塊" + i);
    }
}
raf_read.close();

然后進行緩沖區(qū)與文件讀取寫入,以上代碼塊創(chuàng)建了一個大小為1024字節(jié)的緩沖區(qū)數(shù)組b,用于讀取源文件數(shù)據(jù),并且以只讀模式打開源文件,然后進行分塊操作

循環(huán)分塊數(shù)量chunkNum(對源文件進行分塊后得到的分塊總數(shù)),if循環(huán)判斷分塊文件是否創(chuàng)建成功,如果創(chuàng)建成功,則從源文件中讀取數(shù)據(jù)到緩沖區(qū),直到讀取到文件末尾

再進行分塊文件 合并操作:

各個文件塊讀取完畢后,就可以進行 文件合并 操作,分塊合并步驟

File chunkFolder = new File("D:\\...\\chunk\\");  // 分塊文件目錄
File sourceFile = new File("D:\\...\\星際牛仔1.mp4");  // 原始文件
File mergeFile = new File("D:\\...\\星際牛仔1-1.mp4");  // 合并后的文件
mergeFile.createNewFile();  // 創(chuàng)建空的目標文件

定義分塊文件的存儲目錄,原始文件路徑和合并后的文件路徑,并創(chuàng)建一個空的目標文件

RandomAccessFile raf_write = new RandomAccessFile(mergeFile, "rw");  // 以讀寫模式打開合并文件
byte[] buffer = new byte[1024];  // 讀寫緩沖區(qū)(1KB)

初始化寫入流,RandomAccessFile是一個用于隨機訪問文件的類,適合大文件操作,“rw”表示讀寫模式,byte[ ] buffer = new byte[1024]這段代碼創(chuàng)建了一個字節(jié)數(shù)組,作為讀寫緩沖區(qū)(臨時存儲從文件或網(wǎng)絡中讀取的數(shù)據(jù)),每次讀取1KB數(shù)據(jù),減少磁盤I/O次數(shù)

//listFiles()表示返回目錄中所有文件和子目錄的File數(shù)組,files是包含所有分塊文件的數(shù)組
File[] files = chunkFolder.listFiles();
//將數(shù)組轉(zhuǎn)換為list集合,fileList是包含所以分塊文件的list<File>
List<File> fileList = Arrays.asList(files);
//然后對List進行排序,Comparator.comparingInt創(chuàng)建一個比較器,按照指定規(guī)則排序(將文件名轉(zhuǎn)換為整數(shù)進行排序)
Collections.sort(fileList, Comparator.comparingInt(o -> Integer.parseInt(o.getName())));

對分塊文件進行排序,o -> Integer.parseInt(o.getName()):是一個Lambda表達式,用于將文件名轉(zhuǎn)換為整數(shù)進行排序

//循環(huán)遍歷分塊文件列表
for (File chunkFile : fileList) {
//以只讀模式打開分塊文件 "r"表示以只讀模式打開
    RandomAccessFile raf_read = new RandomAccessFile(chunkFile, "r"); 
//讀取分塊文件內(nèi)容并寫入合并文件
    int len;
    while ((len = raf_read.read(buffer)) != -1) {  
        raf_write.write(buffer, 0, len);  
    }
    raf_read.close();  // 關閉分塊文件流
}
raf_write.close();  // 關閉合并文件流

這段代碼遍歷分塊文件列表,并以只讀模式打開分塊文件,然后讀取分塊文件內(nèi)容并寫入到合并文件,最后關閉分塊文件流和合并文件流

這里我再總結一下掌握斷點續(xù)傳的技術,我們能夠?qū)⒍鄠€分塊文件合并成一個完整文件,避免用戶在下載過程因為網(wǎng)絡,系統(tǒng)等一系列原因?qū)е孪螺d中斷,而需重新開始下載的情況。而是可以直接從中斷處繼續(xù)下載,節(jié)省了我們時間和網(wǎng)絡資源

總結 

到此這篇關于Java斷點續(xù)傳(文件分塊)實現(xiàn)的文章就介紹到這了,更多相關Java斷點續(xù)傳內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java線性結構中棧、隊列和串的基本概念和特點詳解

    Java線性結構中棧、隊列和串的基本概念和特點詳解

    前幾天小編給大家介紹了Java線性結構中的鏈表,除了鏈表這種結構之外,實際上還有棧、隊列、串等結構,那么這些結構又有哪些特點呢,本文就給大家詳細的介紹一下,感興趣的小伙伴跟著小編一起來看看吧
    2023-07-07
  • java實現(xiàn)文件上傳下載和圖片壓縮代碼示例

    java實現(xiàn)文件上傳下載和圖片壓縮代碼示例

    本文給大家介紹的是項目中經(jīng)常需要用到的一個常用的功能,使用java實現(xiàn)文件的上傳下載和圖片的壓縮功能,這里推薦給大家,有需要的小伙伴參考下。
    2015-03-03
  • java中replaceAll替換圓括號實例代碼

    java中replaceAll替換圓括號實例代碼

    正則表達式的保留字符主要有:圓括號、方括號、花括號、豎線、橫線、點號、加號、星號、反斜桿等等,下面這篇文章主要給大家介紹了關于java中replaceAll替換圓括號的相關資料,需要的朋友可以參考下
    2022-10-10
  • SpringCloud升級2020.0.x版之OpenFeign簡介與使用實現(xiàn)思路

    SpringCloud升級2020.0.x版之OpenFeign簡介與使用實現(xiàn)思路

    在微服務系統(tǒng)中,我們經(jīng)常會進行 RPC 調(diào)用。在 Spring Cloud 體系中,RPC 調(diào)用一般就是 HTTP 協(xié)議的調(diào)用。對于每次調(diào)用,都要經(jīng)過一系列詳細步驟,接下來通過本文給大家介紹SpringCloud OpenFeign簡介與使用,感興趣的朋友一起看看吧
    2021-10-10
  • Mybatis?Plus使用@TableId之坑及解決

    Mybatis?Plus使用@TableId之坑及解決

    這篇文章主要介紹了Mybatis?Plus使用@TableId之坑及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 使用kotlin集成springboot開發(fā)的超詳細教程

    使用kotlin集成springboot開發(fā)的超詳細教程

    目前大多數(shù)都在使用java集成 springboot進行開發(fā),本文演示僅僅將 java換成 kotlin,其他不變的情況下進行開發(fā),需要的朋友可以參考下
    2021-09-09
  • 在idea2023中使用SpringBoot整合Lombok全過程及詳細用法

    在idea2023中使用SpringBoot整合Lombok全過程及詳細用法

    Lombok項目是一個java庫,它可以自動插入到編輯器和構建工具中,增強java的性能,本文詳細給大家介紹了在idea2023中使用SpringBoot整合Lombok全過程及詳細用法,需要的朋友可以參考下
    2023-09-09
  • 詳解Mybatis的分頁插件

    詳解Mybatis的分頁插件

    這篇文章主要介紹了詳解Mybatis的分頁插件,在 Mybatis中,如何對數(shù)據(jù)進行分頁是一個非常常見的問題,現(xiàn)在,我們可以通過使用 Mybatis 的分頁插件來實現(xiàn)對數(shù)據(jù)的分頁,需要的朋友可以參考下
    2023-05-05
  • Spring Cache和EhCache實現(xiàn)緩存管理方式

    Spring Cache和EhCache實現(xiàn)緩存管理方式

    這篇文章主要介紹了Spring Cache和EhCache實現(xiàn)緩存管理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java中SpringBoot自定義Starter詳解

    Java中SpringBoot自定義Starter詳解

    這篇文章主要介紹了Java中SpringBoot自定義Starter詳解,Starter是Spring Boot中的一個非常重要的概念,Starter相當于模塊,它能將模塊所需的依賴整合起來并對模塊內(nèi)的Bean根據(jù)環(huán)境進行自動配置,需要的朋友可以參考下
    2023-07-07

最新評論

邵阳市| 扎赉特旗| 阿荣旗| 颍上县| 白河县| 肥乡县| 南靖县| 织金县| 和田县| 开远市| 铜川市| 达孜县| 华宁县| 宝丰县| 宁都县| 包头市| 盘山县| 浪卡子县| 宝兴县| 孟州市| 阿尔山市| 白水县| 寻乌县| 工布江达县| 资中县| 高平市| 丰城市| 福海县| 桐庐县| 易门县| 高尔夫| 洛阳市| 裕民县| 灵丘县| 信宜市| 岳普湖县| 修水县| 江陵县| 岳普湖县| 安丘市| 宁明县|