如何删除目录下重复文件,实现效果?

摘要:摘要:通过MD5算法对指定目录下的文件去重。 背景 之前写了一篇博客《Java判断两个文件是否相同》,介绍如何校验两个文件内容是否相同,但是,不适用于对目录下文件去重的场景,故对其进行扩展。 文件去重 本文中使用的核心工具类DigestUt
摘要:通过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通过递归遍历指定目录的文件树列出其中的所有文件,返回的是文件路径流,通常用于遍历文件的场景。