通過MD5排除重復文件


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

辛虧腦袋還比較好使,既然作為一個程序員,為什么不能寫個代碼處理一下呢?想到點子說干咱就干,最重要的問題就是怎么判斷圖片是不是重復的呢?通過文件名?還是比較大小?好像都不怎么靠譜啊。。突然又是靈光一閃,每個文件不都是有個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);
}

各位看官們要是有什么更好的方法可以給我提出來啊。最后還是不管遇到什么問題還是要先仔細的分析研究一下,不要急着動手敲代碼,思路清晰了敲出來的代碼才會更有效。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM