java MD5比较文件内容
最近用到,记下来……
功能:
对指定目录下的所有TXT文件,通过MD5比较内容,删除掉重复的文件。文件的扩展可以修改成.docx、.doc、.jpg、.png,或者其它类型,根据需求灵活修改。
public class CompareFile { public static void recursionDel(String direct){
//遍历得到文件所在目录下的txt文件
File dirFile=new File(direct);
FilenameFilter filter=new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".txt");
}
}; List<File> list=new ArrayList<File>();
try {
//查找符合条件的文件
list = getFile(dirFile, filter, list);
//删除重复的文件,保留第一个
for (int i = 0;i<list.size();i++){
list.get(i).delete();
}
} catch (IOException e) {
e.printStackTrace();
} }
//获取指定目录下指定类型的文件(包括子目录)
private static List<File> getFile(File dir,FilenameFilter filter,List<File>list)throws IOException
{
File[]files=dir.listFiles();
for(File file:files)
{
if (file.isDirectory()) {// 如果需要对子目录查重,下面这行注释去掉
// getFile(file, filter, list);
}
else {
if(filter.accept(dir, file.getName()))//是文件则将文件放入list列表中
list.add(file);
}
} list = recursionCompare(list);
return list;
}
//比较文件MD5值
private static List<File> recursionCompare(List<File> list) {
Collections.sort(list,new Comparator<File>(){
public int compare(File o1, File o2) {
return String.valueOf(o2.lastModified()).compareTo(String.valueOf(o1.lastModified()));
}
});
int size = list.size();
String dateStr = "";
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//获取文件最新日期
if(size>0){
File fistFile = list.get(0);
cal.setTimeInMillis(fistFile.lastModified());
//文件的最新日期
dateStr = sdf.format(cal.getTime());
} String dateStr2 = "";
List<File> lis = new ArrayList<>();
//找到日期相同的文件,一旦不同,退出,避免全盘遍历
for(File f:list){
cal.setTimeInMillis(f.lastModified());
dateStr2 = sdf.format(cal.getTime());
if(dateStr.equals(dateStr2)){
lis.add(f);
}else{
break;
}
} List<File> reList = new ArrayList<File>();//返回
//如果需要对所有文件(不仅仅是最新日期的)遍历,则lis=list;
for (int i = 0;i<lis.size();i++){
for(int k = i+1;k<lis.size();k++){
String str1 = getFileMD5(lis.get(i));
String str2 = getFileMD5(lis.get(k));
if(str1.equals(str2)){
reList.add(lis.get(k));
break;
}
}
}
//重复的文件,不包含本身
return reList;
} // 计算文件的 MD5 值
public static String getFileMD5(File file) {
if (!file.isFile()) {
return null;
}
MessageDigest digest = null;
FileInputStream in = null;
byte buffer[] = new byte[8192];
int len;
try {
digest =MessageDigest.getInstance("MD5");
in = new FileInputStream(file);
while ((len = in.read(buffer)) != -1) {
digest.update(buffer, 0, len);
}
BigInteger bigInt = new BigInteger(1, digest.digest());
return bigInt.toString(16);
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
try {
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
} }
java MD5比较文件内容的更多相关文章
- java读取txt文件内容
package read; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; public ...
- JAVA获取txt文件内容
JAVA 读取txt文件内容 通常,我们可以直接通过文件流来读取txt文件的内容,但有时可能会出现乱码!此时只要设置一下文件字符编码即可. public class txttest { /** * 读 ...
- Java 实例 - 读取文件内容
原文作者:菜鸟教程 原文链接:Java 实例 - 读取文件内容(建议前往原文以获得最佳体验) 按行读取文本文件 import java.io.*; public class Main { public ...
- Java 读取 txt 文件内容到容器 List
方法一: 一.桌面上准备 DataObject.txt 文件,内容为: 二.打开 Eclipse,编写代码如下: import java.io.BufferedReader; import java. ...
- java对excel文件内容读写修改操作
Read.java package domain; import java.io.FileInputStream; import java.io.InputStream; import jxl.Cel ...
- Java之修改文件内容:字符串逐行替换
依赖包: <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</a ...
- java nio 映射文件内容到内存
FileChannel 的一个最好的功能就是能将文件的某个部分直接映射到内存.这要感谢 FileChannel.map() 方法,这个方法有下面三个参数: mode:映射到内存需要指定下面三种模式之一 ...
- Java:清空文件内容
文章来源:https://www.cnblogs.com/hello-tl/p/9139432.html import java.io.*; public class FileBasicOperati ...
- Java:获取文件内容
文章来源:https://www.cnblogs.com/hello-tl/p/9139353.html import java.io.*; public class FileBasicOperati ...
随机推荐
- PHP的Session机制
客户端浏览器和服务器之间通信使用的http协议是一种无状态的协议,在它看来,客户端发起的每个请求都是独立.没有关联的.然而,在实际的Web应用开发中,服务器却经常需要根据用户以往的一些状态或数据对请求 ...
- 虚拟专用网VPN
1. 三个专用地址块: (1)10.0.0.0到10.255.255.255 (2)172.16.0.0到172.31.255.255 (3)192.168.0.0到192.168.255.255 2 ...
- celery rabbit mq 详解
Celery介绍和基本使用 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, ...
- 使用jQuery中trigger()方法自动触发事件
一.常用事件 在页面加载完成时 自动触发input的点击事件,在移动端可以实现自动弹出输入法,获得焦点 $("input").trigger("click") ...
- enum(枚举类型)
可以使用枚举类型声明代表整数常量的符号名称. 通过enum,创建一个新类型,并指定它可以拥有的值.(就像平常用一个整形变量,我们指定它等于0的时候代表什么,1呢,2呢...而通过枚举,就增加了程序的可 ...
- R语言高性能编程,优化(一)
这段时间学习了<R高性能编程>这本书,基于这段时间做的项目实践,总结了一些自己的体会,和大家分享 一.为什么R程序有时候会很慢?1.计算性能的三个限制条件 cpu ram io R代码本身 ...
- Prime Ring Problem
Problem Description A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ... ...
- PHP(一)OOP基础
[面向过程&面向对象] 1.面向过程:专注于解决一件事情的过程.最大的特点,是有一个个函数来实现功能需求 2.面向对象:专注于有哪一个对象来实现这个功能,最大的特点,时产生一个个具有属性和方法 ...
- POI/Excel/HTML单元格公式问题
一.问题描述 使用MyBatis从数据库中获取数据,然后用POI把数据填充到Excel模板中,生成最终的xls文件.把最终的xls文件转换为html文件,并返回给前台显示在Panel中. Excel模 ...
- JS中有关数组Array的常用方法函数
Array对象的方法主要有如下几种(我所知道的): concat()连接两个或多个数组,并返回结果,但是值得注意的是该方法并不改变数组本身,而仅仅返回一个数组连接的副本. push()在数组后面添加一 ...