zoukankan      html  css  js  c++  java
  • 文件分块与合并

    1. 文件分块

    文件分块的流程如下:

    1. 获取源文件长度
    2. 根据设定的分块文件的大小计算出块数
    3. 从源文件读数据依次向每一个块文件写数据。
    //测试文件分块方法
        @Test
        public void testChunk() throws IOException {
            File sourceFile = new File("D:/test/ffmpeg/test.mp4");
            String chunkPath = "D:/test/ffmpeg/file/";
            File chunkFolder = new File(chunkPath);
            if (!chunkFolder.exists()) {
                chunkFolder.mkdirs();
            }
            //分块大小
            long chunkSize = 1024 * 1024 * 1;
            //分块数量
            long chunkNum = (long) Math.ceil(sourceFile.length() * 1.0 / chunkSize);
            if (chunkNum <= 0) {
                chunkNum = 1;
            }
            //缓冲区大小
            byte[] b = new byte[1024];
            //使用RandomAccessFile访问文件
            RandomAccessFile raf_read = new RandomAccessFile(sourceFile, "r");
            //分块
            for (int i = 0; i < chunkNum; i++) {
                //创建分块文件
                File file = new File(chunkPath + i);
                boolean newFile = file.createNewFile();
                if (newFile) {
                    //向分块文件中写数据
                    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();
                }
            }
            raf_read.close();
        }
    

    2. 文件合并

    文件合并流程:

    1. 找到要合并的文件并按文件合并的先后进行排序。
    2. 创建合并文件
    3. 依次从合并的文件中读取数据向合并文件写入数
    //测试文件合并方法
        @Test
        public void testMerge() throws IOException {
            //块文件目录
            File chunkFolder = new File("D:/test/ffmpeg/file/");
            //合并文件
            File mergeFile = new File("D:/test/ffmpeg/test1.mp4");
            if (mergeFile.exists()) {
                mergeFile.delete();
            }
            //创建新的合并文件
            mergeFile.createNewFile();
            //用于写文件
            RandomAccessFile raf_write = new RandomAccessFile(mergeFile, "rw");
            //指针指向文件顶端
            raf_write.seek(0);
            //缓冲区
            byte[] b = new byte[1024];
            //分块列表
            File[] fileArray = chunkFolder.listFiles();
            //  转成集合,便于排序
            List<File> fileList = new ArrayList<File>(Arrays.asList(fileArray));
            //  从小到大排序
            Collections.sort(fileList, new Comparator<File>() {
                @Override
                public int compare(File o1, File o2) {
                    if (Integer.parseInt(o1.getName()) < Integer.parseInt(o2.getName())) {
                        return -1;
                    }
                    return 1;
                }
            });
            //合并文件
            for (File chunkFile : fileList) {
                RandomAccessFile raf_read = new RandomAccessFile(chunkFile, "rw");
                int len = -1;
                while ((len = raf_read.read(b)) != -1) {
                    raf_write.write(b, 0, len);
                }
                raf_read.close();
            }
            raf_write.close();
        }
    

  • 相关阅读:
    CSS选择器
    CSS的语法规范
    CSS简介
    spring 工厂模式解耦的升级版(多例转单例)
    Html label标签
    Java 多线程入门详解
    Html 表单
    Html 列表
    web项目的建立(idea版本)
    工厂模式详解
  • 原文地址:https://www.cnblogs.com/ifme/p/12127074.html
Copyright © 2011-2022 走看看