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通过递归遍历指定目录的文件树列出其中的所有文件,返回的是文件路径流,通常用于遍历文件的场景。
Java 删除目录下相同文件的更多相关文章
- 火狐删除配置文件 会删除目录下所有文件 切记不要把配置文件建立在桌面 恢复软件:易我数据恢复向导 9.0 DiskGenius500
火狐删除配置文件 会删除目录下所有文件 切记不要把配置文件建立在桌面 恢复软件:易我数据恢复向导 9.0 DiskGenius500 结果:由于时间比较常 恢复文件均失败了~
- java删除目录下符合条件的文件
自己做的一个小程序,目的是:删除某个目录下所有的文件大小为0的文件.同理其他的条件也可以,只需修改delFile()方法中的判断条件即可. 下面是代码,有需要的同学可以参考下,如有错误请指出,不胜感激 ...
- Linux删除目录下的文件的10种方法
看到了一遍文章,便突发奇想的想起Linux中删除目录下的所有文件的方法:整理了几个,如有不足,还望读者不吝赐教! 删除当前目录下的文件 1.rm -f * #最经典的方法,删除当前目录下的所有类型的文 ...
- python glob删除目录下的文件
使用glob匹配目录下的文件 import os import glob path="./" for infile in glob.glob(os.path.join(path,& ...
- linux删除目录下所有文件,但是保留文件夹
删除目录和子目录下所有rpm文件,但是保留文件夹,先cd到想要删除的目录 命令如下 find ./ -name "*.rpm" | xargs rm
- Python实现删除目录下相同文件
让我们来分析一下这个问题:首先,文件个数非常多,手工查找是不现实的,再说,单凭我们肉眼,在几千张图片或文件里面找到完全相同的难度也是很大的.所以要用程序实现.那么用程序怎么实现呢?根据什么判断两个文件 ...
- 递归删除目录下.svn文件
原文:http://imysqldba.blog.51cto.com/1222376/1104901 ------------------------------------------------- ...
- BAT-使用BAT方法删除目录下0KB文件
@Echo Off For /f "tokens=*" %%i in ('dir /a-d /b /s "*.*"') do ( If " (Del ...
- Java中删除文件、删除目录及目录下所有文件(转)
原文链接:Java中删除文件.删除目录及目录下所有文件 知识点:File.delete()用于删除“某个文件或者空目录”!所以要删除某个目录及其中的所有文件和子目录,要进行递归删除,具体代码示例如下: ...
- Java中删除文件、删除目录及目录下所有文件
转载自:http://www.cnblogs.com/eczhou/archive/2012/01/16/2323431.html 功能:删除某个目录及目录下的所有子目录和文件 知识点:File.de ...
随机推荐
- 码云git笔记
以后要日常使用这个东西,所以今天又学习了下,具体链接如下: 码云帮助中心https://gitee.com/help/articles/4122 先记录一点简单的入门东西: Git 全局设置: git ...
- 【Matlab函数】提取inp文件中的节点、单元数据并保留集合信息
功能 提取hypermesh2020(其他版本也可以)中的节点.单元信息,并保留elem set信息. 返回的是一个结构体 输入输出参数 输入: inp文件路径,如:'example.inp'.&qu ...
- go的异常抛出
defer func() { if r := recover(); r != nil { fmt.Println("Recovered:", r) } }() 在任何涉及到数组取值 ...
- Pydantic字段元数据指南:从基础到企业级文档增强
title: Pydantic字段元数据指南:从基础到企业级文档增强 date: 2025/3/28 updated: 2025/3/28 author: cmdragon excerpt: 通过Py ...
- 【AI工具实战】一招解决英文视频困境,四步用AI搞定全中文字幕,你也可以!(文末附工具下载)
"AI时代最大的红利,是让每个人都有机会成为那个"想到就能做到"的创造者." AI粉嫩特攻队,2025年4月5日. 故事源于一个我想看的国外视频.本想点开视频准 ...
- c数组与结构体
数组,存储同类型的复合类型:结构体,存储不同类型的复合类型,用于自定义数据结构. 计算机中,针对存储大量数据的集合,有着两种方式,一种是以块式集中存储数据,这就是数组的存储方式,大量同类型的数据集中放 ...
- mybatis报错Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.ArrayList and java
原因 传入参数为List<String>不能用lists != '' 判断 解决 将lists != '' 的判断去掉或者改为lists .size>0 其他 如果是Integer类 ...
- Windows与Linux通过Samba共享文件夹
Ubuntu系统,按如下步骤执行: 1.安装samba服务 sudo apt update sudo apt install samba -y 2.创建共享目录 sudo mkdir -p /home ...
- Redis底层数据结构 链表
链表 Redis 的 List 对象的底层实现之一就是链表.C 语言本身没有链表这个数据结构的,所以 Redis 自己设计了一个链表数据结构. 链表节点结构设计 先来看看「链表节点」结构的样子: ty ...
- Linux运维基础(一)安装centos7系统到VMware中
内容导航: 1.安装VMware虚拟机 2.在VMware虚拟机中安装centos7系统 一.安装VMware 此时虚拟机就安装完毕了,接下来需要设置虚拟主机网络的配置 其中vmnet8相当于一块网卡 ...