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 ...
随机推荐
- linux服务器压力/性能测试命令
linux命令下使用ab -c500 -n2000 http://www.test.cn 进行压力测试 在Linux命令行中,ab 是 Apache HTTP server benchmarki ...
- s = 0.5 * a * Math.pow(t,2),关于js动画,从一个公式说起
s = 0.5 * a* t*t 上边这个是高中物理课本关于位移的计算公式,位移等于二分之一乘以a乘以t的平方,a是加速度,t是运动进行的时间(当然啦,初速度为0).下面我们会应用这个公式完成一个js ...
- go krotos proto编译引用外部包 was not found or had errors
前言 kratos protos 生成 pb.go 文件时,会出现引用其他 proto 文件报错 was not found or had errors,因找不到此文件而无法编译. 解决 首先我们先了 ...
- linux命令:lsof命令
lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以如传输控制协议 ...
- ORA-01779: 无法修改与非键值保存表对应的列”中涉及的概念和解决方法
什么是键值保存表(Key-Preserved Table)? 在理解什么是键值保存表之前,首先要知道 可更新的联接视图 这个概念,键值保存表只是保存了允许更新的字段信息的一张表.为什么会出现这么一张表 ...
- Win7共享账号切换程序
服务器共享目录需要多账号登录时,需要重启电脑才可切换不同账号登 为了不重启电脑就可立即切换不同账号登,特意写了此款软件, 下载: 链接:https://pan.baidu.com/s/1g_4SCXl ...
- 工作日记-storm集群业务崩溃和解决方案
背景 昨天公司业务部门报告业务崩溃,查看各个业务节点后,定位问题到storm集群. 打开storm ui查看下任务状态,发现可以加载页面元素,但是无法加载数据,分析是nimbus挂掉了,重启nimbu ...
- 【Java】关键字的使用
java中有很多的关键字,他们的使用让Java语言变得更加灵活.易用,下面将介绍Java中最常用的几个关键字并说明其用法. 一.关键字:return--跳出 使用在方法体中,用于:① 结束方法② 针对 ...
- 【Ubuntu】在Ubuntu上安装IDEA
[Ubuntu]在Ubuntu上安装IDEA 零.前言 最近换了Ubuntu系统,但是还得是要写代码,这样就不可避免地用到IDEA,接下来介绍一下如何在Ubuntu上安装IDEA. 壹.下载 这一步应 ...
- WebKit Inside: 渲染树
经过CSS的匹配,就要进入渲染树的构建. 渲染树也叫RenderObject树,因为渲染树上每一个节点,都是RenderObject的子类. 首先来看一下RenderObject的继承类图. 1 Re ...