import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Set; import java.util.Map.Entry; import com.zynamics.io.FileUtils; public class CheckSummer { private final HashMap> fileSizes = new HashMap>(); private final HashMap> md5s = new HashMap>(); private final HashMap> md5s2 = new HashMap>(); public static void main(String[] args) { CheckSummer cs = new CheckSummer(); cs.traverse(new File("F:\\@@")); try { cs.md5_first(); cs.md5_second(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } cs.print(); } private void print() { Set>> values = md5s2.entrySet(); for (Entry> e : values) { if (e.getValue().size() == 1) { continue; } System.out.println("Equal"); for (File f : e.getValue()) { System.out.println(f.getAbsolutePath()); } } } private void md5_second() throws IOException { Set>> values = md5s.entrySet(); for (Entry> e : values) { if (e.getValue().size() == 1) { continue; } for (File file : e.getValue()) { String md5 = FileUtils.calcMD5(file); if (md5s2.containsKey(md5)) { md5s2.get(md5).add(file); } else { ArrayList list = new ArrayList(); list.add(file); md5s2.put(md5, list); } } //md5s.remove(e.getKey()); } } private void md5_first() throws IOException { Set>> values = fileSizes.entrySet(); for (Entry> e : values) { // System.out.println(e.getValue().size()); if (e.getValue().size() == 1) { continue; } for (File file : e.getValue()) { byte[] data = FileUtils.readFile(file, 100); String md5 = FileUtils.calcMD5(data); // System.out.printf("%s has size %s\n", file.getAbsoluteFile(), md5); if (md5s.containsKey(md5)) { md5s.get(md5).add(file); } else { ArrayList list = new ArrayList(); list.add(file); md5s.put(md5, list); } } //fileSizes.remove(e.getKey()); } } private void traverse(File directory) { File[] files = directory.listFiles(); for (File file : files) { if (file.isDirectory()) { traverse(file); } else { long length = file.length(); System.out.printf("%s has size %d\n", file.getAbsoluteFile(), length); if (fileSizes.containsKey(length)) { fileSizes.get(length).add(file); } else { ArrayList list = new ArrayList(); list.add(file); fileSizes.put(length, list); } } } } }