首页 > 编程语言 >断点续传:使用java对大文件进行分块与合并

断点续传:使用java对大文件进行分块与合并

时间:2024-07-05 14:42:22浏览次数:20  
标签:断点续传 java int bytes 对大 RandomAccessFile len File new

通常我们下载上传的视频文件比较大。虽然https协议没有规定上传文件大小的限制,但是网络的质量,电脑硬件的参差不齐可能会导致大文件快要上传完成的时候突然断网了要重新上传,非常影响用户体验。以此我们引入了断点续传的功能。

什么是断点续传呢?就是我们在上传下载文件的时候,将一个大文件人为的分成一些小文件。后续即便是遇到了网络故障,我们也可以在网络恢复后继续进行未完成的部分,没必要重新开始。

 

采用java的IO流实现文件的分块与合并

    @Test
    public void testChunk() throws IOException {
        // 源文件
        File file = new File("E:\\mini\\testForChunk.mp4");
        // 分后的路径
        String chunkPath = "E:\\mini\\chunk\\";
        File chunkFolder = new File(chunkPath);
        if (!chunkFolder.exists()) {
            chunkFolder.mkdirs();
        }

        // 1MB
        int chunkSize = 1024 * 1024;
        int chunkNum = (int) Math.ceil(file.length() * 1.0 / chunkSize);
        System.out.println(chunkNum);
        // 使用流读数据再向块中写数据
        RandomAccessFile raf_r = new RandomAccessFile(file, "r");

        byte[] bytes = new byte[chunkSize];

        for (int i = 0; i < chunkNum; i++) {
            File chunkFile = new File(chunkPath + i);
            // 分块文件写入流
            RandomAccessFile raf_rw = new RandomAccessFile(chunkFile, "rw");
            int len=-1;
            while ((len = raf_r.read(bytes)) != -1) {
                raf_rw.write(bytes, 0, len);
                if (chunkFile.length() >= chunkSize) {
                    break;
                }
            }
            raf_rw.close();
        }
        raf_r.close();
    }

    @Test
    public void testMerge() throws IOException {
        File chunkFolder = new File("E:\\mini\\chunk\\");

        File mergeFile = new File("E:\\mini\\merge.mp4");
        // 取出所有分块文件
        File[] files = chunkFolder.listFiles();
        Arrays.sort(files, new Comparator<File>() {
            @Override
            public int compare(File o1, File o2) {
                return Integer.parseInt(o1.getName())-Integer.parseInt(o2.getName());
            }
        });
        RandomAccessFile write = new RandomAccessFile(mergeFile, "rw");
        byte[]bytes=new byte[1024];
        for (File file : files) {
            RandomAccessFile read = new RandomAccessFile(file, "r");
            int len=-1;
            while (((len = read.read(bytes)) != -1)) {
                write.write(bytes,0,len);
            }
            read.close();
        }
        write.close();
    }

 

标签:断点续传,java,int,bytes,对大,RandomAccessFile,len,File,new
From: https://www.cnblogs.com/kun1790051360/p/18284860

相关文章

  • JAVA API营业执照识别、企业工商信息查询
    现如今,随着互联网技术的不断成熟与智能应用的不断普及,人们对于营业执照识别技术的需求越来越大。像工商、税务、银行、网上注册等一些应用场景在进行经营活动和业务中,都需要对营业执照的信息进行采集和录入,无论是个人业务还是企业对公业务都在逐步的互联网化。对于平台与......
  • java List子父级集合转List树工具类
    javaList集合转Tree集合1.创建泛型工具类packagecom.demo;importorg.springframework.util.CollectionUtils;importjava.lang.reflect.Field;importjava.util.ArrayList;importjava.util.Collections;importjava.util.List;importjava.util.Map;importjava.u......
  • 温故而知新,详细讲讲JavaScript的防抖与节流
    前言:哈喽,大家好,我是前端菜鸟的自我修养!今天给大家详细讲讲JavaScript的防抖与节流,包含二者的区别与优缺点、使用场景,并提供具体代码帮助大家深入理解,彻底掌握!原创不易,如果能帮助到带大家,欢迎收藏+关注哦......
  • [Java] Java 关键字 : transient
    0序Java中的transient关键字,transient是短暂的意思。对于transient修饰的成员变量,在类的实例对象的序列化处理过程中会被忽略。因此,transient变量不会贯穿对象的序列化和反序列化,生命周期仅存于调用者的内存中而不会写到磁盘里进行持久化。1序列化Java中对象的序列化指的是......
  • JAVA API营业执照识别、企业工商信息查询
    现如今,随着互联网技术的不断成熟与智能应用的不断普及,人们对于营业执照识别技术的需求越来越大。像工商、税务、银行、网上注册等一些应用场景在进行经营活动和业务中,都需要对营业执照的信息进行采集和录入,无论是个人业务还是企业对公业务都在逐步的互联网化。对于平台......
  • 2.2 实验三、自动生成语法分析程序(JavaCUP)
    help-assignment2.3实验三、自动生成语法分析程序(JavaCUP)实验三要求你下载一个语法分析程序自动生成工具JavaCUP,利用该工具自动产生一个Oberon-0语言的语法分析和语法制导翻译程序;生成的程序源代码是以Java语言编写的。2.3.1实验步骤3.1、下载自动生成工具Java......
  • 微信小程序源码-基于Java后端的餐厅点餐系统毕业设计(附源码+论文)
    大家好!我是程序员一帆,感谢您阅读本文,欢迎一键三连哦。......
  • 微信小程序源码-基于Java后端的球馆预约系统毕业设计(附源码+论文)
    大家好!我是程序员一帆,感谢您阅读本文,欢迎一键三连哦。......
  • 微信小程序源码-基于Java后端的英语互助系统毕业设计(附源码+论文)
    大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。......
  • Java 方法中循环调用具有事务的方法
    在Java中,循环调用一个具有事务的方法时,需要特别注意事务的边界和管理。通常,事务的边界是由框架(如Spring)来控制的,确保方法执行时数据的完整性和一致性。然而,在循环中调用事务方法时,每个调用都可以被视为独立的事务,除非特别配置以允许跨多个方法调用共享同一事务。1.Java方法中循......