Java 删除目录下相同文件

摘要:通过MD5算法对指定目录下的文件去重。

背景

  之前写了一篇博客《Java判断两个文件是否相同》,介绍如何校验两个文件内容是否相同,但是,不适用于对目录下文件去重的场景,故对其进行扩展。

文件去重

  本文中使用的核心工具类DigestUtils来自如下jar包:

<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.18.0</version>
</dependency>

  要判断多个文件是否相同,猿友们可以基于DigestUtils.md5Hex通过计算文件的 MD5 哈希值来实现。如果两个文件内容的字节流 MD5 哈希值相同,则可以认为这两个文件的内容是相同的。以下是一个基于Map的、简单的 Java 代码示例,演示如何计算文件的 MD5 哈希值并判断文件是否相同:

import org.apache.commons.codec.digest.DigestUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;

/**
 * @Author Wiener
 * @Date 2025-02-17
 * @Description: 通过MD5算法对文件去重
 */
public class distinctFileByMd5 {

    public static void main(String[] args) {
        // 替换为实际文件目录
        String targetPath = "/Users/楼兰胡杨/文件目录";
        walkDelete(targetPath);
    }

    /**
     * 检查指定目录下的文件是否相同,如果相同,只保留一个
     *
     * @param targetPath
     */
    public static void walkDelete(String targetPath) {
        Path dir = Paths.get(targetPath);
        /**
         * key: md5
         * value: 文件名
         */
        Map<String, String> distinctFileMd5Map = new HashMap<>();
        try (Stream<Path> paths = Files.walk(dir)) {
            paths.forEach(path -> {
                if (Files.isRegularFile(path)) {
                    // 是文件,转成md5字符串校验是否存在相同文件
                    String fileName = path.toString();
                    // 通过路径+名字拿到旧文件
                    File f = new File(fileName);
                    String fileMd5 = "";
                    try {
                        fileMd5 = DigestUtils.md5Hex(new FileInputStream(f));
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                    if (distinctFileMd5Map.containsKey(fileMd5)) {
                        f.delete();
                        System.out.println("已经存在的文件名是: " + distinctFileMd5Map.get(fileName));
                        System.out.println("删除的文件名是: " + fileName);
                    } else {
                        distinctFileMd5Map.put(fileMd5, fileName);
                    }
                } else if (Files.isDirectory(path)) {
                    // 是目录,不校验
                    System.out.println("Directory: " + path);
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

  nio中新提供的Files类可以很方便的操作文件,Files.walk通过递归遍历指定目录的文件树列出其中的所有文件,返回的是文件路径流,通常用于遍历文件的场景。

posted @   楼兰胡杨  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
历史上的今天:
2021-02-17 Spring AOP 面向切面编程之AOP是什么
2021-02-17 面试题-简单介绍 Spring MVC 执行流程或者Spring MVC的工作原理
点击右上角即可分享
微信分享提示