java MD5比较文件内容

最近用到,记下来……

功能:

对指定目录下的所有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 }
View Code

 

转载于:https://www.cnblogs.com/modairy/p/7993055.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过计算文件MD5 摘要来比较文件是否相同,方法如下: ```java import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class FileMD5 { public static void main(String[] args) { String file1Path = "file1.txt"; String file2Path = "file2.txt"; File file1 = new File(file1Path); File file2 = new File(file2Path); try { String file1MD5 = getFileMD5(file1); String file2MD5 = getFileMD5(file2); if (file1MD5.equals(file2MD5)) { System.out.println("两个文件相同"); } else { System.out.println("两个文件不同"); } } catch (Exception e) { e.printStackTrace(); } } public static String getFileMD5(File file) throws NoSuchAlgorithmException, IOException { MessageDigest md5Digest = MessageDigest.getInstance("MD5"); FileInputStream fis = new FileInputStream(file); byte[] buffer = new byte[1024]; int read = fis.read(buffer, 0, 1024); while (read != -1) { md5Digest.update(buffer, 0, read); read = fis.read(buffer, 0, 1024); } fis.close(); byte[] md5Bytes = md5Digest.digest(); BigInteger bigInt = new BigInteger(1, md5Bytes); String md5 = bigInt.toString(16); while (md5.length() < 32) { md5 = "0" + md5; } return md5; } } ``` 在上述代码中,我们定义了一个`getFileMD5()`方法,用于计算文件MD5 摘要。这个方法首先获取一个`MessageDigest`实例,并指定要使用的哈希算法为 MD5。然后,它读取文件内容,并通过`MessageDigest.update()`方法将其传递给哈希算法进行处理。最后,它调用`MessageDigest.digest()`方法获取最终的哈希值,并将其转换成十六进制字符串返回。 在`main()`方法中,我们分别计算了两个文件MD5 摘要,并比较它们是否相同。如果相同,则输出“两个文件相同”,否则输出“两个文件不同”。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值