旨在找到指定区域的相同文件

居然没有积分不让共享代码,好坑爹的设定啊

最近搞了一些JAVA EE的教学视频,发现不同的文件件里有好多重复的文件,尤其是视频文件,太占硬盘空间了,遂写下这段代码。

package dk.test.demo;
/**
 * 帮你找到重复的文件,并可以删除他们(如出意外,概不负责)
 * 很显然,这是java,没有C的速度,如文件夹过大,请耐心等待
 * 理论上讲取样越多,精确度越高,但效率也就越慢
 *
 * Dean
 */

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

public class Test11 {
 private static int  num = 2;
 private static int byteSize = 20;
 private static boolean isSub = false;
 private static boolean isDel = false;
 // 线程安全的HashMap
 //如果文件 太多或抽样次数过多,可能会导致内存溢出
 private static ConcurrentHashMap<String,String> map = new ConcurrentHashMap<String, String>();
 
 public static void main(String[] args) throws Exception {
  //*********************************
  //控制台
  //地址
  String path = "F:/java2";
  //一个文件 抽样几次,这个参数必须大于0, 默认为2
//  num = 3;
  //样本大小 默认为20 单位byte
//  byteSize = 20;
  //是否遍历子目录 默认为false
  isSub = true;
  //是否将相同文件 默认为false
//  isDel = true;
  
  //*********************************
  
  if(num<1) {
   System.out.println("Num is too small");
   return;
  }
  File file = new File(path);
  
  findLike(file);
  
  contrast();
 }
 /**
  *
  * @param file
  * @throws Exception
  */
 public static void findLike(File file) throws Exception {

  File[] listFiles = file.listFiles();
  for (File file2 : listFiles) {
   if(file2.isDirectory()) {
    if(isSub) {
     findLike(file2);
    }
   }else {
    StringBuffer sb = new StringBuffer();
    long length = file2.length();
    InputStream is = new FileInputStream(file2);
    byte[] buffer = new byte[byteSize];
    for (int i = 0; i < num; i++) {
     is.skip(length/(num-i+1));
     is.read(buffer);
     sb.append(new String(buffer));
     sb.append("-");
    }
    is.close();
//    System.out.println(sb);
    map.put(file2.toString(), sb.toString());
   }
  }
//  System.out.println(map.size());
 }
 
 public static void contrast() throws Exception {
  List<String> list = new ArrayList<String>();
  Set<Entry<String,String>> entrySet = map.entrySet();
  for (Entry<String, String> entry : entrySet) {
   if(list.contains(entry.getKey())) {
    continue;
   }
   for (Entry<String, String> entry2 : entrySet) {
    if(entry.getValue().equals(entry2.getValue()) && !entry.getKey().equals(entry2.getKey())) {
     System.out.println(entry.getKey()+"  and  "+entry2.getKey());
     list.add(entry2.getKey());
//     entrySet.remove(entry2);
    }
   }
  }
  System.out.println("repeat object:"+list.size());
  if(isDel) {
  for (int i = 0; i < list.size(); i++) {
    File file = new File(list.get(i));
    boolean b = file.delete();
    System.out.println("delete:"+list.get(i) + "  is "+b);
   }
  }
 }
}

 

你可能感兴趣的:(java,查找相同文件)