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通过递归遍历指定目录的文件树列出其中的所有文件,返回的是文件路径流,通常用于遍历文件的场景。
读后有收获,小礼物走一走,请作者喝咖啡。

作者:楼兰胡杨
本文版权归作者和博客园共有,欢迎转载,但请注明原文链接,并保留此段声明,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源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的工作原理