将一个大文件,拆分成10份,然后,再合并这10份文件,合并成一个新文件,最后通过MD5值,判断 新文件和老文件是否相同。

1.文件上传 并进行分割保存进缓冲区。

private static void splitFile(String sourceFilePath, String splitFolder, int numSplits) throws IOException {
        File sourceFile = new File(sourceFilePath);
        //获取源文件的大小
        long fileSize = sourceFile.length();
        //计算每个分割文件的大小
        long splitSize = fileSize / numSplits;
        //打开源文件输出流  使用 try with resources 自动关闭输入流
        try (InputStream inputStream = new FileInputStream(sourceFile)) {
            //创建用于缓存的数组
            byte[] buffer = new byte[1024];
            //根据定义的分割数量进行分割文件
            for (int i = 0; i < numSplits; i++) {
                //拼接分割文件的名字
                String splitFileName = splitFolder + "/split" + i + ".part";
                //打开文件输出流 使用try with resources 自动关闭输出流
                try (OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(splitFileName))) {
                    //定义变量,记录每次读取的字节数
                    int bytesRead;
                    //记录当前分割文件中已经写入的字节数
                    long bytesWritten = 0;
                    //循环读取源文件中的数据。知道读满一个分割文件的大小或文件末尾
                    while (bytesWritten < splitSize && (bytesRead = inputStream.read(buffer)) != -1) {
                        //将读取的数据写入分割文件中。并更新计数器
                        outputStream.write(buffer, 0, bytesRead);
                        bytesWritten += bytesRead;
                    }
                }
            }
        }
    }

2.合并文件

public static void mergeFiles(String splitFolder, String mergedFilePath, int numSplits) throws IOException {
        //创建合并后的文件对象
        File mergeFile = new File(mergedFilePath);
        //如果合并后的文件不存在,则创建文件
        if (!mergeFile.exists()) {
            mergeFile.createNewFile();
        }
        //打开文件输出流,使用buffered writer缓冲写入数据
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(mergeFile), "UTF-8"));
        //循环读取指定数量的分割文件。并将其内容写入到合并后的文件中
        for (int i = 0; i < numSplits; i++) {
            String splitFileName = splitFolder + "/split" + i + ".part";
            File splitFile = new File(splitFileName);
            BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(splitFile), "UTF-8"));
            //定义字符数组和读取字节数变量
            char[] chars = new char[1024];
            int bytesRead;
            while ((bytesRead = reader.read(chars)) != -1) {
                writer.write(chars, 0, bytesRead);
            }
            //关闭分割文件输入流,删除分割文件
            reader.close();
            splitFile.delete();
        }
        writer.close();
    }

3.计算文件的MD5值

static String calculateMD5(String filePath) throws NoSuchAlgorithmException, IOException {
        //创建一个对象,指定使用md5算法   抛出异常
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        //打开计算MD5值的文件输入流  抛出异常
        FileInputStream inputStream = new FileInputStream(filePath);
        //创建一个byte数组的缓冲区。
        byte[] bytes = new byte[65536];
        int read;
        //循环读取文件中的数据,并将其更新到MD5中。
        while ((read = inputStream.read(bytes)) != -1){
            md5.update(bytes,0,read);
        }

        //获取MD5的值
        byte[] digest = md5.digest();
        //将byte数组形式的MD5值转换为16进制字符串。
        StringBuilder builder = new StringBuilder();
        for (byte b : digest) {
            builder.append(String.format("%02x",b));
        }
        //返回十六进制的字符串
        return builder.toString();
    }

4.再次定义比较MD5的方法

比较两个文件的MD5值是否相同
private static boolean compareFiles(String file1,String file2) throws NoSuchAlgorithmException, IOException {
        //分别计算两个文件的MD5
        String s = calculateMD5(file1);
        String s1 = calculateMD5(file2);
        //判断两个文件的值,使用equals比较
        return s.equals(s1);
    }

最后,在main方法中

public static void main(String[] args) throws IOException, NoSuchAlgorithmException {
        //定义需要的变量
        String sourceFilePath = "D:\\files/每日进度.txt"; // 原始文件路径
        String splitFolder = "D:\\files"; // 拆分文件存储的文件夹路径
        String mergedFilePath = "D:\\files/进度测试.txt"; // 合并后文件的路径
        int numSplits = 10; // 拆分文件的数量

        //调用拆分方法 传入参数, 抛出异常
        splitFile(sourceFilePath,splitFolder,numSplits);
        //调用合并方法
        mergeFiles(splitFolder,mergedFilePath,numSplits);
        //调用方法,这判断文件是否相同
        boolean b = compareFiles(sourceFilePath, mergedFilePath);
        //将比较的结果输出到控制台
        if(b){
            System.out.println("比较相同,导入失败");
        }else {
            System.out.println("比较不同,导入成功");
        }
    }

调用方法。添加变量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值