經過MD5排除重複文件

今天下載了好多美女圖片壁紙,但是看了一下發現好多圖片重複了,有強迫症的我必須把重複的都給剔除掉,首先想到的固然是百度了,問問度娘有沒有什麼圖片去重的工具,搜了一下還真有。奈何本人智商捉急用不來這高級的軟件,無奈之下只好準備一張一張的挑出來了,CTRL+A一看2000+的圖片,好吧一夜不用幹別的事了。。java

辛虧腦殼還比較好使,既然做爲一個程序員,爲何不能寫個代碼處理一下呢?想到點子說幹咱就幹,最重要的問題就是怎麼判斷圖片是否是重複的呢?經過文件名?仍是比較大小?好像都不怎麼靠譜啊。。忽然又是靈光一閃,每一個文件不都是有個DNA信息嘛,相同的文件MD5值確定是同樣的嘛。程序員

廢話說了這麼多,下面說正經的了,首先要怎麼得到文件的MD5值呢?這回度娘倒沒讓我失望了,直接上代碼:工具

String p = "E:\\123.jpg";
FileInputStream fis = new FileInputStream(p);
String md5 = DigestUtils.md5Hex(IOUtils.toByteArray(fis));
IOUtils.closeQuietly(fis);
System.out.println("md5: "+md5);

獲得全部文件的md5以後進行比較,相同的md5就是重複的文件了。md5已經獲得了剩下的就很簡單了,經過File取到全部的文件,而後再獲取文件的MD5,再寫個雙重for循環排除掉相同的md5,寫完收工搞定。運行起來就等結果了,這一等就是兩個小時。。好在結果卻是挺不錯。可是這個時間有點讓人接受不了啊,這個代碼仍是有問題啊,得優化。又一想,集合去重複這不能夠用Set嘛,趕忙把代碼稍做改造,分分鐘搞定。。差距也恁大了,看來這java基礎仍是不夠牢固啊。又要從頭看一遍書了。。附上最終代碼:優化

String path = "E:\\123";
File dir = new File(path);
String[] files = dir.list();
Map<String,String> map=new HashMap<String,String>();
for (int i = 0; i < files.length; i++)
{
    String p = path + "\\" + files[i];
    FileInputStream fis = new FileInputStream(p);
    String md5 = DigestUtils.md5Hex(IOUtils.toByteArray(fis));
    IOUtils.closeQuietly(fis);
    map.put(md5,files[i]);
}
Iterator<String> it = map.keySet().iterator();
while (it.hasNext())
{
    String md5=it.next();
    String filename=map.get(md5);
    System.out.println("不重複的文件:"+filename);
}

各位看官們要是有什麼更好的方法能夠給我提出來啊。最後仍是無論遇到什麼問題仍是要先仔細的分析研究一下,不要急着動手敲代碼,思路清晰了敲出來的代碼纔會更有效。ui

明天再準備作一個簡單的客戶端程序,這樣之後就不用每次來運行代碼了。回頭會把源代碼附上。code

相關文章
相關標籤/搜索