今天下載了好多美女圖片壁紙,可是看了一下發現好多圖片重復了,有強迫癥的我必須把重復的都給剔除掉,首先想到的當然是百度了,問問度娘有沒有什么圖片去重的工具,搜了一下還真有。奈何本人智商捉急用不來這高級的軟件,無奈之下只好準備一張一張的挑出來了,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);}各位看官們要是有什么更好的方法可以給我提出來啊。最后還是不管遇到什么問題還是要先仔細的分析研究一下,不要急著動手敲代碼,思路清晰了敲出來的代碼才會更有效。
明天再準備做一個簡單的客戶端程序,這樣以后就不用每次來運行代碼了。回頭會把源代碼附上。
新聞熱點
疑難解答