【Java 开发工具】Java实现文件切分与合并

156 阅读2分钟

废话不多说系列:直接上源码,利用Java 程序实现文件的切分与合并业务需求。美女4.png

一、完整源码

import org.springframework.util.ObjectUtils;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Objects;
import java.util.UUID;

/**
 * 文件分割和合并工具类
 *
 * @author zl
 * @create 2021-05-16 9:55
 */
public class FileSplitAndMergeUtil {

    public static void main(String[] args) throws Exception {
        String srcFile = "D:/splitFile/src.pdf";
        String targetDir = "D:/splitFile/merge_" + UUID.randomUUID().toString() + "/";
        String outDir = "D:/splitFile/";
        // 拆分文件
        split(new File(srcFile), 1024 * 100, targetDir);
        // 合并文件
        merge(targetDir, outDir);
    }

    /**
     * 拆分文件
     *
     * @param f          文件
     * @param fileLength 拆分后的每个文件最大大小(例如 fileLength=1024 * 100,即切分为 100K大小的文件)
     * @param targetDir  拆分好的文件的存放目录(例如 "src/test/resources/file/" )
     */
    public static void split(File f, long fileLength, String targetDir) throws IOException {
        RandomAccessFile src = new RandomAccessFile(f, "r");
        int numberOfPieces = (int) (src.length() / fileLength) + 1;
        int len = -1;
        byte[] b = new byte[1024];
        if (!new File(targetDir).exists()) {
            if (new File(targetDir).mkdir()) {
                System.out.println("创建目录成功");
            } else {
                System.out.println("创建目录失败");
                return;
            }

        }
        for (int i = 0; i < numberOfPieces; i++) {
            String name = targetDir + f.getName() + "." + (i + 1);
            File file = new File(name);
            RandomAccessFile dest = new RandomAccessFile(file, "rw");
            while ((len = src.read(b)) != -1) {
                dest.write(b, 0, len);
                //如果太大了就不在这个子文件写了 换下一个
                if (dest.length() > fileLength) {
                    break;
                }
            }
            dest.close();
        }
        System.out.println("分割文件成功");
        src.close();
    }


    /**
     * 文件合并
     *
     * @param targetDir 切分后的子文件目录(例如 "src/test/resources/file/")
     * @param outDir    合并后的文件目录(例如 "src/test/resources/file/merge")
     * @throws IOException I/O异常
     */
    public static void merge(String targetDir, String outDir) throws IOException {
        // 1.检查文件夹目录下是否存在文件
        File dir = new File(targetDir);
        if (dir.isFile()) {
            System.out.println("error: 传入的是一个文件,应该传入一个文件夹目录地址!");
            return;
        }
        if (dir.isDirectory() && ObjectUtils.isEmpty(dir.listFiles())) {
            System.out.println("error: 传入的文件夹目录地址为空,里面无任何文件!");
            return;
        }
        // 2.准备合并后的文件相关信息
        File file = new File(outDir + "new-" + UUID.randomUUID().toString().replaceAll("-", "") + ".pdf");
        RandomAccessFile in = new RandomAccessFile(file, "rw");
        in.setLength(0);
        in.seek(0);
        byte[] bytes = new byte[1024];
        int len = -1;
        // 3.将指定目录下的所有文件合并起来
        for (File listFile : Objects.requireNonNull(dir.listFiles())) {
            RandomAccessFile out = new RandomAccessFile(listFile, "rw");
            while ((len = out.read(bytes)) != -1) {
                in.write(bytes, 0, len);
            }
            out.close();
        }
        System.out.println("合并文件成功");
        in.close();
    }
}

二、测试示例

(1)准备好一个资源文件

image.png

(2)main 执行结果

程序执行结果如下:

image.png

merge-* 为切割后文件存放的目录, new-* 为合并后的新文件

image.png

文件src.pdf 切割后的文件 image.png


至此,谢谢阅读!美女4.png