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

通常我们下载上传的视频文件比较大。虽然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();
    }
复制代码

 

posted @   天启A  阅读(92)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示