Сравнение md5

Как мы все знаем, вы можете использовать md5, чтобы сравнить, являются ли два файла одинаковыми. Когда я писал демо, произошла ошибка. Я использовал два метода для сравнения двух файлов. Метод 2 был более успешным, но метод 1 не удался.
Примечание: test — это исходный видеофайл, а test2 — файл, который был разделен на блоки, а затем объединен. Оба можно воспроизводить нормально, с одинаковым размером данных.

//方法1     失败
    String s1 = DigestUtils.md5Hex("E:\\test.mp4");
        String s2 = DigestUtils.md5Hex("E:\\test2.mp4");

        if (s2.equals(s1)){
            System.out.println("文件校验完整");
        }

  //方法2 成功
  FileInputStream fileInputStream_merge = new FileInputStream(mergeFile);
        FileInputStream fileInputStream_source = new FileInputStream(sourceFile);
        String s1 = DigestUtils.md5Hex(fileInputStream_merge);
        String s2 = DigestUtils.md5Hex(fileInputStream_source);

        if (s2.equals(s1)){
            System.out.println("文件校验完整");
        }

После поиска информации
первым способом является вычисление значений MD5 двух копий, но значения MD5 двух копий различны, тогда это может быть связано с тем, что метаданные двух копий различны. Метаданные включают в себя такую ​​информацию, как время создания файла, время модификации и время доступа . Если информация отличается, вычисленное значение MD5 также будет другим.
Второй метод вычисляет значение MD5 двух копий, а значения MD5 двух копий одинаковы, тогда это может быть потому, что метаданные двух копий одинаковы или различаются только метаданные, но файл содержание то же самое. Потому что второй способ считает только содержимое файла, независимо от разницы в метаданных.
Резюме: Сравнение согласованности файлов или нет - это вообще сравнение содержимого. Попробуйте использовать потоки для работы. Хотя потоковые операции в io медленные, они занимают меньше памяти, а метод прямого чтения файлов - противоположный.

   //测试分块
    @Test
    public void testChunk() throws IOException {
        //源文件
        File sourceFile = new File("E:\\test.mp4");
        //分块文件存储输出路径
        String chunkFilePath="E:\\chunck\\";
        //分块大小
        int chunkSize=1024*1024*1;
        //对块数向上取整
        int chunkNum= (int) Math.ceil(sourceFile.length()*1.0/chunkSize);
        //使用流从源文件读取数据
        RandomAccessFile r = new RandomAccessFile(sourceFile, "r");
        //缓存区
        byte [] bytes=new byte[1024];
        //循环写入文件
        for (int i = 0; i < chunkNum; i++) {
            //创建一个目标文件
            File file = new File(chunkFilePath + i);
            //从流中写到file
            RandomAccessFile rw = new RandomAccessFile(file, "rw");
            int len=-1;
            while ((len=r.read(bytes))!=-1){
                rw.write(bytes,0,len);
                if (file.length()>=chunkSize) break;
            }
            rw.close();
        }
        r.close();
    }

    //测试合并
    @Test
    public void testMerge() throws IOException {
        //块文件目录
        File chunkFile = new File("E:\\chunck\\");
        //源文件,用于比较md5值判断他们是否完整
        File sourceFile = new File("E:\\test.mp4");
        //合并后的文件
        File mergeFile = new File("E:\\test2.mp4");

        //取出所有分块文件
        File[] files = chunkFile.listFiles();
        //将数组转成list
        List<File> fileList = Arrays.asList(files);
        //对分块文件进行排序
        Collections.sort(fileList, new Comparator<File>() {
            @Override
            public int compare(File o1, File o2) {
                return Integer.parseInt(o1.getName())-Integer.parseInt(o2.getName());
            }
        });
        //向合并文件写流
        RandomAccessFile rw = new RandomAccessFile(mergeFile, "rw");
        //缓存区
        byte[] bytes = new byte[1024];
        //遍历分块文件,向合并的文件写
        for (File file : fileList) {
            //读取分块的流
            RandomAccessFile r = new RandomAccessFile(file, "r");
            int len=-1;
            while ((len=r.read(bytes))!=-1){
                rw.write(bytes,0,len);
            }
            r.close();
        }
        rw.close();
        //合并文件完成后对文件进行md5校验
//        FileInputStream fileInputStream = new FileInputStream(mergeFile);
//        String s1 = DigestUtils.md5Hex("E:\\test.mp4");
//        String s2 = DigestUtils.md5Hex("E:\\test2.mp4");
        FileInputStream fileInputStream_merge = new FileInputStream("E:\\test.mp4");
        FileInputStream fileInputStream_source = new FileInputStream("E:\\test2.mp4");
        String s1 = DigestUtils.md5Hex(fileInputStream_merge);
        String s2 = DigestUtils.md5Hex(fileInputStream_source);
        if (s2.equals(s1)){
            System.out.println("文件校验完整");
        }

Supongo que te gusta

Origin blog.csdn.net/qq_56533553/article/details/129852844
Recomendado
Clasificación