最近用到,记下来……
功能:
对指定目录下的所有TXT文件,通过MD5比较内容,删除掉重复的文件。文件的扩展可以修改成.docx、.doc、.jpg、.png,或者其它类型,根据需求灵活修改。

1 public class CompareFile { 2 3 public static void recursionDel(String direct){ 4 //遍历得到文件所在目录下的txt文件 5 File dirFile=new File(direct); 6 FilenameFilter filter=new FilenameFilter() { 7 @Override 8 public boolean accept(File dir, String name) { 9 return name.endsWith(".txt"); 10 } 11 }; 12 13 List<File> list=new ArrayList<File>(); 14 try { 15 //查找符合条件的文件 16 list = getFile(dirFile, filter, list); 17 //删除重复的文件,保留第一个 18 for (int i = 0;i<list.size();i++){ 19 list.get(i).delete(); 20 } 21 } catch (IOException e) { 22 e.printStackTrace(); 23 } 24 25 } 26 //获取指定目录下指定类型的文件(包括子目录) 27 private static List<File> getFile(File dir,FilenameFilter filter,List<File>list)throws IOException 28 { 29 File[]files=dir.listFiles(); 30 for(File file:files) 31 { 32 if (file.isDirectory()) {// 如果需要对子目录查重,下面这行注释去掉 33 // getFile(file, filter, list); 34 } 35 else { 36 if(filter.accept(dir, file.getName()))//是文件则将文件放入list列表中 37 list.add(file); 38 } 39 } 40 41 list = recursionCompare(list); 42 return list; 43 } 44 //比较文件MD5值 45 private static List<File> recursionCompare(List<File> list) { 46 Collections.sort(list,new Comparator<File>(){ 47 public int compare(File o1, File o2) { 48 return String.valueOf(o2.lastModified()).compareTo(String.valueOf(o1.lastModified())); 49 } 50 }); 51 int size = list.size(); 52 String dateStr = ""; 53 Calendar cal = Calendar.getInstance(); 54 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 55 //获取文件最新日期 56 if(size>0){ 57 File fistFile = list.get(0); 58 cal.setTimeInMillis(fistFile.lastModified()); 59 //文件的最新日期 60 dateStr = sdf.format(cal.getTime()); 61 } 62 63 String dateStr2 = ""; 64 List<File> lis = new ArrayList<>(); 65 //找到日期相同的文件,一旦不同,退出,避免全盘遍历 66 for(File f:list){ 67 cal.setTimeInMillis(f.lastModified()); 68 dateStr2 = sdf.format(cal.getTime()); 69 if(dateStr.equals(dateStr2)){ 70 lis.add(f); 71 }else{ 72 break; 73 } 74 } 75 76 List<File> reList = new ArrayList<File>();//返回 77 //如果需要对所有文件(不仅仅是最新日期的)遍历,则lis=list; 78 for (int i = 0;i<lis.size();i++){ 79 for(int k = i+1;k<lis.size();k++){ 80 String str1 = getFileMD5(lis.get(i)); 81 String str2 = getFileMD5(lis.get(k)); 82 if(str1.equals(str2)){ 83 reList.add(lis.get(k)); 84 break; 85 } 86 } 87 } 88 //重复的文件,不包含本身 89 return reList; 90 } 91 92 // 计算文件的 MD5 值 93 public static String getFileMD5(File file) { 94 if (!file.isFile()) { 95 return null; 96 } 97 MessageDigest digest = null; 98 FileInputStream in = null; 99 byte buffer[] = new byte[8192]; 100 int len; 101 try { 102 digest =MessageDigest.getInstance("MD5"); 103 in = new FileInputStream(file); 104 while ((len = in.read(buffer)) != -1) { 105 digest.update(buffer, 0, len); 106 } 107 BigInteger bigInt = new BigInteger(1, digest.digest()); 108 return bigInt.toString(16); 109 } catch (Exception e) { 110 e.printStackTrace(); 111 return null; 112 } finally { 113 try { 114 in.close(); 115 } catch (Exception e) { 116 e.printStackTrace(); 117 } 118 } 119 } 120 121 }