【文件分片、合并工具类】

【文件分片、合并工具类】,第1张

文件分片、合并工具类】

文件分片、合并工具类
  • 一、前言
  • 二、工具类使用步骤
    • 1.添加相关maven依赖
    • 2.工具类代码
    • 3.调用测试
  • 三、结语


一、前言

前段时间笔者在开发项目过程中涉及到大文件的传输功能。笔者实现的思路是先将大文件进行压缩,后分成多个小文件进行传输,接收端接收后再进行小文件合并,后再进行解压得到原文件。下面是笔者提供的工具类,可拿来直接使用。


二、工具类使用步骤 1.添加相关maven依赖

	org.projectlombok
	lombok
	1.18.16

2.工具类代码
package com.ctsi.dbbackup.core.util;

import lombok.extern.slf4j.Slf4j;

import java.io.*;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;


@Slf4j
public class FileSplitUtil {
    
    private static final int FILE_SIZE = 1024;

    
    private static final int FILE_NAME_EXT = 1000;

    
    private static final int EOF = -1;

    
    private static final String SPLIT_FILE_NAME = "-split.";

    
    private static final String PLACEHOLDER = "zzz";

    
    public static void split(File srcFile, String outPutDir, String compressType) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));

        //拆分成每个为10kb大小的文件
        int saveSize = 10 * FILE_SIZE;
        byte[] bytes = new byte[saveSize];

        int length;
        // 子文件下标
        int filenameExt = FILE_NAME_EXT;
        while ((length = bis.read(bytes)) > EOF) {
            int ext = filenameExt++;
            try (BufferedOutputStream bos =
                         new BufferedOutputStream(new FileOutputStream(outPutDir + ext + SPLIT_FILE_NAME + compressType))) {
                bos.write(bytes, 0, length);
            }
        }
        bis.close();
    }

    
    public static void merge(String sliceDir, String compressType) throws IOException {
        List subFileNames = getSplitFileNames(sliceDir, compressType);
        if (subFileNames.size() < 1) {
            throw new RuntimeException("目录下没有分片文件...");
        }

        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream(sliceDir + UuidUtil.getUuid() + "." + compressType));
        for (String subFilename : subFileNames) {
            try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sliceDir + subFilename))) {
                // 每次读取1Mb大小的文件
                byte[] bytes = new byte[FILE_SIZE];
                int length;
                while ((length = bis.read(bytes)) > EOF) {
                    bos.write(bytes, 0, length);
                }
                bos.flush();
            } finally {
                File eachSubFile = new File(sliceDir + subFilename);
                if (eachSubFile.exists() && eachSubFile.delete()) {
                    log.info("删除分片文件成功...");
                }
            }
        }
        bos.close();
    }

    
    public static List getSplitFileNames(String sliceDir, String compressType) {
        File file = new File(sliceDir);
        if (!file.isDirectory()) {
            throw new RuntimeException("不是一个目录...");
        }

        String[] list = file.list();
        if (list == null || list.length == 0) {
            throw new RuntimeException("目录下没有任何文件...");
        }

        // 这里zzz为通用占位符、匹配分片文件
        String filename = (PLACEHOLDER + SPLIT_FILE_NAME + compressType).replace(PLACEHOLDER, "\d+");
        return Arrays.stream(list)
        		.filter(s -> s.matches(filename))
            	.sorted()
                .collect(Collectors.toList());
    }
}

3.调用测试
  • main方法
public static void main(String[] args) throws IOException {
    // 分片
    split(new File("E:/opt/aaa/test.zip"), "E:/opt/aaa/", "zip");

    //合并
    merge("E:/opt/bbb/", "zip");
}
  • 调用前

  • 调用后


三、结语

以上便是笔者封装的文件分片、合并工具类。若有出入的地方, 欢迎博友们指正。笔者感激不尽!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5681483.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存