Java 刪除目錄下相同文件
摘要:通過MD5算法對(duì)指定目錄下的文件去重。
背景
??之前寫了一篇博客《Java判斷兩個(gè)文件是否相同》,介紹如何校驗(yàn)兩個(gè)文件內(nèi)容是否相同,但是,不適用于對(duì)目錄下文件去重的場(chǎng)景,故對(duì)其進(jìn)行擴(kuò)展。
文件去重
??本文中使用的核心工具類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>
??要判斷多個(gè)文件是否相同,猿友們可以基于DigestUtils.md5Hex通過計(jì)算文件的 MD5 哈希值來實(shí)現(xiàn)。如果兩個(gè)文件內(nèi)容的字節(jié)流 MD5 哈希值相同,則可以認(rèn)為這兩個(gè)文件的內(nèi)容是相同的。以下是一個(gè)基于Map的、簡(jiǎn)單的 Java 代碼示例,演示如何計(jì)算文件的 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算法對(duì)文件去重
*/
public class distinctFileByMd5 {
public static void main(String[] args) {
// 替換為實(shí)際文件目錄
String targetPath = "/Users/樓蘭胡楊/文件目錄";
walkDelete(targetPath);
}
/**
* 檢查指定目錄下的文件是否相同,如果相同,只保留一個(gè)
*
* @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)) {
// 是文件,轉(zhuǎn)成md5字符串校驗(yàn)是否存在相同文件
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("已經(jīng)存在的文件名是: " + distinctFileMd5Map.get(fileName));
System.out.println("刪除的文件名是: " + fileName);
} else {
distinctFileMd5Map.put(fileMd5, fileName);
}
} else if (Files.isDirectory(path)) {
// 是目錄,不校驗(yàn)
System.out.println("Directory: " + path);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}
??nio中新提供的Files類可以很方便的操作文件,F(xiàn)iles.walk通過遞歸遍歷指定目錄的文件樹列出其中的所有文件,返回的是文件路徑流,通常用于遍歷文件的場(chǎng)景。
讀后有收獲,小禮物走一走,請(qǐng)作者喝咖啡。
Buy me a coffee. ?Get red packets.作者:樓蘭胡楊
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但請(qǐng)注明原文鏈接,并保留此段聲明,否則保留追究法律責(zé)任的權(quán)利。

浙公網(wǎng)安備 33010602011771號(hào)