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

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

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

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

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

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

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

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

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

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

先進(jìn)行大文件資源 分塊操作:

1.導(dǎo)入一系列的包

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.*;

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

2.定義相關(guān)的類和方法

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

定義一個(gè)公共類BigFileTest,用于包含文件處理相關(guān)的測試方法,并且定義了一個(gè)testChunk方法,該方法用于執(zhí)行文件分塊操作,并聲明了可能拋出IOException異常,因?yàn)槲募僮骺赡軙?/p>

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)建一個(gè)File對象,表示要對d:/develop/bigfile_test/路徑下的nacos.mp4源文件進(jìn)行分塊,并創(chuàng)建一個(gè)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);

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

5.進(jìn)行對文件的讀取寫入

//緩沖區(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();

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

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

再進(jìn)行分塊文件 合并操作:

各個(gè)文件塊讀取完畢后,就可以進(jìn)行 文件合并 操作,分塊合并步驟

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)建空的目標(biāo)文件

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

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

初始化寫入流,RandomAccessFile是一個(gè)用于隨機(jī)訪問文件的類,適合大文件操作,“rw”表示讀寫模式,byte[ ] buffer = new byte[1024]這段代碼創(chuàng)建了一個(gè)字節(jié)數(shù)組,作為讀寫緩沖區(qū)(臨時(shí)存儲從文件或網(wǎng)絡(luò)中讀取的數(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進(jìn)行排序,Comparator.comparingInt創(chuàng)建一個(gè)比較器,按照指定規(guī)則排序(將文件名轉(zhuǎn)換為整數(shù)進(jìn)行排序)
Collections.sort(fileList, Comparator.comparingInt(o -> Integer.parseInt(o.getName())));

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

//循環(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();  // 關(guān)閉分塊文件流
}
raf_write.close();  // 關(guān)閉合并文件流

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

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

總結(jié) 

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

相關(guān)文章

  • Java線性結(jié)構(gòu)中棧、隊(duì)列和串的基本概念和特點(diǎn)詳解

    Java線性結(jié)構(gòu)中棧、隊(duì)列和串的基本概念和特點(diǎn)詳解

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

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

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

    java中replaceAll替換圓括號實(shí)例代碼

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

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

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

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

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

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

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

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

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

    詳解Mybatis的分頁插件

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

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

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

    Java中SpringBoot自定義Starter詳解

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

最新評論

青川县| 雷州市| 江永县| 台南市| 锦州市| 永吉县| 刚察县| 鄂托克旗| 阳高县| 保德县| 延庆县| 巴马| 阳山县| 彭阳县| 从江县| 盐城市| 闻喜县| 绥宁县| 元江| 边坝县| 高安市| 石嘴山市| 弋阳县| 江川县| 孝感市| 德化县| 芦山县| 台东市| 浠水县| 凯里市| 志丹县| 天门市| 北辰区| 常熟市| 黎平县| 敦煌市| 阿拉善左旗| 汽车| 即墨市| 玛沁县| 嵩明县|