删除一个目录下的重复文件(与文件名无关)

来源:互联网 发布:加强网络舆情管理 编辑:程序博客网 时间:2024/06/08 18:00
java有一些时间了,一直没有做出点实用的东西,最近从网上抓了一些图片玩,可是有时候抓重复了,抓图软件又把图片给重命名了,一个一个删的话又太麻烦了,刚好刚刚学了io就试着写了一个程序,现在已经能运行了,主要思路是先算出md5算法,再与已有的md5值列表匹配,下面是全部代码:

[java] view plaincopyprint?
  1. package md5; 
  2. import java.io.BufferedInputStream; 
  3. import java.io.File; 
  4. import java.io.FileInputStream; 
  5. import java.io.FileNotFoundException; 
  6. import java.io.IOException; 
  7. import java.security.MessageDigest; 
  8. import java.security.NoSuchAlgorithmException; 
  9. import java.util.ArrayList; 
  10. import java.util.List; 
  11. import java.util.Scanner; 
  12. public class DelExistFiles3 { 
  13.     //定义一个数组,用来存放不重复的文件的MD5值 
  14.     private List<String> md5List = new ArrayList<String>(); 
  15.     static int num =0
  16.     /**
  17.      * 删除指定目录下的所有重复文件
  18.      * @param path      要删除的文件路径
  19.      */ 
  20.     public void delFile(String path){ 
  21.         File f = new File(path); 
  22.         //如果给的是一个文件,则继续 
  23.         if(f.isFile()){ 
  24.             //取得该文件的MD5值 
  25.             String md5 = getMd5(f).toString(); 
  26.             //如果存放md5值的数组不为空 
  27.             if(md5List.size()>0){ 
  28.                 for(String s:md5List){ 
  29.                     //如果数组中有了和该文件md5z值相同的项,表明该文件已经存在,删除该文件 
  30.                     if(md5.equals(s)){ 
  31.                         f.delete(); 
  32.                         num++; 
  33.                         System.out.println("文件/t"+f.getName()+"/t和已有文件重复,已被删除"); 
  34.                     } 
  35.                 } 
  36.                 //判断该文件是否存在,如果该文件没有被删除,表明没有和该文件相同的文件,则把其md5值存入数组之中 
  37.                 if(f.exists()){ 
  38.                     md5List.add(md5); 
  39.                 } 
  40.             }else
  41.                 //数组为空,表示还没有相同的项,将把其md5值存入数组之中 
  42.                 md5List.add(md5); 
  43.             } 
  44.         }else if(f.isDirectory()){ 
  45.             //拿到它的子文件列表 
  46.             File[] flist = f.listFiles(); 
  47.             for(File file :flist){ 
  48.                 //如果列表项为File,则继续,同上 
  49.                 if(file.isFile()){ 
  50.                     String md5 = getMd5(file).toString(); 
  51.                     if(md5List.size()>0){ 
  52.                         for(String s:md5List){ 
  53.                             if(md5.equals(s)){ 
  54.                                 file.delete(); 
  55.                                 num++; 
  56.                                 System.out.println("文件/t"+file.getName()+"/t和已有文件重复,已被删除"); 
  57.                             } 
  58.                         } 
  59.                         if(file.exists()){ 
  60.                             md5List.add(md5); 
  61.                         } 
  62.                     }else
  63.                         md5List.add(md5); 
  64.                     } 
  65.                     //如果列表项为文件夹,递归调用自身 
  66.                 }else if(file.isDirectory()){ 
  67.                     delFile(file.getPath()); 
  68.                 } 
  69.             } 
  70.         } 
  71.     } 
  72.     /**
  73.      * 取得文件的Md5值
  74.      * @param file      要计算的文件
  75.      * @return          MD5值的字符序列
  76.      */ 
  77.     public static StringBuilder getMd5(File file){ 
  78.         StringBuilder sb = new StringBuilder(); 
  79.         StringBuilder fileNotFound = new StringBuilder("系统找不到指定的路径,请重新输入"); 
  80.         StringBuilder noAlgorith = new StringBuilder("无法进行Md5加密算法,可能是因为的java虚拟机版本太低"); 
  81.         StringBuilder IOError = new StringBuilder("IO错误"); 
  82.         try
  83.             MessageDigest md5 = MessageDigest.getInstance("MD5");  //生产MD5类的实例 
  84.             FileInputStream in = new FileInputStream(file); 
  85.             BufferedInputStream bs = new BufferedInputStream(in); 
  86.             byte[] b = newbyte[bs.available()];            //定义数组b为文件不受阻塞的可读取字节数 
  87.              
  88.             //将文件以字节方式读取到数组b中 
  89.             while((bs.read(b,0, b.length)) != -1){ 
  90.             } 
  91.             md5.update(b);          //执行md5算法 
  92.             for(byte by : md5.digest()){ 
  93.                 sb.append(String.format("%02X", by));  //将生成的字节转化成16进制的字符串 
  94.             } 
  95.             bs.close(); 
  96.         } catch (NoSuchAlgorithmException e) { 
  97.             return noAlgorith; 
  98.         } catch (FileNotFoundException e) { 
  99.             return fileNotFound; 
  100.         } catch (IOException e) { 
  101.             return IOError; 
  102.         } 
  103.         return sb; 
  104.     } 
  105.     public staticvoid main(String[] args) { 
  106.         DelExistFiles3 df = new DelExistFiles3(); 
  107.         System.out.println("请输入要删除的文件夹"); 
  108.         Scanner scanner = new Scanner(System.in); 
  109.         String str = scanner.next(); 
  110.         df.delFile(str); 
  111.         System.out.println("操作结束,共删除了/t"+num+"/t个重复文件"); 
  112.     } 
  113. }  

将上面代码保存进一个名为DelExistFiles.java的文件中就OK了

转载地址:http://blog.csdn.net/j2eelamp/article/details/6408366

0 0
原创粉丝点击