最近用到,记下来……

功能:

对指定目录下的所有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比较文件内容的更多相关文章

  1. java读取txt文件内容

    package read; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; public ...

  2. JAVA获取txt文件内容

    JAVA 读取txt文件内容 通常,我们可以直接通过文件流来读取txt文件的内容,但有时可能会出现乱码!此时只要设置一下文件字符编码即可. public class txttest { /** * 读 ...

  3. Java 实例 - 读取文件内容

    原文作者:菜鸟教程 原文链接:Java 实例 - 读取文件内容(建议前往原文以获得最佳体验) 按行读取文本文件 import java.io.*; public class Main { public ...

  4. Java 读取 txt 文件内容到容器 List

    方法一: 一.桌面上准备 DataObject.txt 文件,内容为: 二.打开 Eclipse,编写代码如下: import java.io.BufferedReader; import java. ...

  5. java对excel文件内容读写修改操作

    Read.java package domain; import java.io.FileInputStream; import java.io.InputStream; import jxl.Cel ...

  6. Java之修改文件内容:字符串逐行替换

    依赖包: <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</a ...

  7. java nio 映射文件内容到内存

    FileChannel 的一个最好的功能就是能将文件的某个部分直接映射到内存.这要感谢 FileChannel.map() 方法,这个方法有下面三个参数: mode:映射到内存需要指定下面三种模式之一 ...

  8. Java:清空文件内容

    文章来源:https://www.cnblogs.com/hello-tl/p/9139432.html import java.io.*; public class FileBasicOperati ...

  9. Java:获取文件内容

    文章来源:https://www.cnblogs.com/hello-tl/p/9139353.html import java.io.*; public class FileBasicOperati ...

随机推荐

  1. 超级详细 一听就会:利用JavaScript jQuery实现图片无限循环轮播(不借助于轮播插件)

    前言 作为一个前端工程师,无论公司是什么行业,无论你做什么端,基本都会遇到一个避不开的动画效果:循环轮播.做轮播并不难,市场上的轮播插件有很多,其中比较著名的是swiper,使用也非常简单.但轮播插件 ...

  2. css左侧固定宽度,右侧自适应的几种实现方法

    左侧固定,右侧自适应或者右侧固定在,左侧自适应是一样的.这种布局很常见,而且面试过程中也经常会问到,这里我总结的方法一共有5种.要实现这种布局,也算比较简单.我们先给出html结构: <div ...

  3. 视频加载logo 2

    推荐这个网站 http://www.flaticon.com/ http://www.flaticon.com/search?word=spinner  旋转图标 http://www.flatico ...

  4. 笔记-测试崩溃之memcpy_s

    昨天晚上提测,今天早上测试发来贺电,程序崩溃!!!!!! 而问题出在memcpy_s errno_t memcpy_s( void *dest, size_t numberOfElements, co ...

  5. 使用css3实现瀑布流布局效果

    使用CSS3可以轻松实现瀑布流布局,但这种方法有个缺点,就是对于商城类型的网站,价格筛选时,并不能达到理想效果. 1.column-count 把div中的文本分为多少列 2.column-width ...

  6. C++ UI资源

    最近又来搞界面了,现把这几天收集到的资料汇总下,方便今后慢慢学习! Duilib: Duilib是一个Windows下免费开源的DirectUI界面库,由于简约易扩展的设计以及稳定高效的实现被各大互联 ...

  7. MySQL数据库储存bit类型的值报错

    当我们储存bit类型的值时,不能直接写入数字 上图中的画圈部分就是bit类型,若是直接填入"1"或"0"等等就会报错,如下: 这时候,我们要看bit(M)的M值 ...

  8. enum(枚举类型)

    可以使用枚举类型声明代表整数常量的符号名称. 通过enum,创建一个新类型,并指定它可以拥有的值.(就像平常用一个整形变量,我们指定它等于0的时候代表什么,1呢,2呢...而通过枚举,就增加了程序的可 ...

  9. spark在yarn-cluster模式,错误查找方法

    yarn logs -applicationId application_xxxx_xxx 可选(">exception")

  10. 关联查询一张小表。对性能有影响吗(mysql)

     具体语句  SELECT dfm.id, dfm.member_code, dfm.member_name, dfm.recommend_code, dfm.member_rank, dfm.cre ...