zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    linux设备驱动归纳总结(三):7.异步通知fasync【转】
    linux设备驱动归纳总结(三):6.poll和sellct【转】
    linux设备驱动归纳总结(三):5.阻塞型IO实现【转】
    【转】14.5.6 禁止和激活中断线
    【转】ubuntu连接android设备(附最简单方法)
    【转】Everything中文绿色版在Win7/8用不了?
    【转】使用dos2unix批量转换文件
    【转】Android开发工具--android-studio-bundle-141.2288178
    【转】Win8/8.1/Win7小技巧:揪出C盘空间占用的真凶
    【转】文件同步软件FreeFileSync
  • 原文地址:https://www.cnblogs.com/modairy/p/7993055.html
Copyright © 2011-2022 走看看