android 刪除重復(fù)文件

1.問(wèn)題:整理之前手機(jī)照片,文件發(fā)現(xiàn)有很多重復(fù)的文件,而且目錄比較雜亂,分布零散,就想寫一個(gè)工具程序,刪除重復(fù)文件,寫完后封裝成一個(gè)工具類得了。
2.思路:無(wú)法根據(jù)文件名判斷文件是否重復(fù),故使用MD5校驗(yàn); 遇到有文件夾的,列出下面文件,判斷文件還是文件夾,涉及遞歸。
刪除重復(fù)文件代碼:

/**
 * Created by dong on 2017/1/10.
 * 刪除重復(fù)文件   調(diào)用時(shí),傳入目標(biāo)路徑即可
 */

public class DeleteSameFile {
    static List<String> md5List=new ArrayList<>();
    static int num = 0;
    public static void delFile(String path) throws IOException {
        File f = new File(path);
        if(f.isFile()){                           //如果是一個(gè)文件,則繼續(xù)
            isFileAndDeleteFile(f);

        }else if(f.isDirectory()){                     //如果是一個(gè)目錄,則拿到它的子文件列表
            File[] flist = f.listFiles();
            for(File file :flist){
                if(file.isFile()){    //列表項(xiàng)為File,則繼續(xù),同上
                    isFileAndDeleteFile(file);

                }else if(file.isDirectory()){     //列表項(xiàng)為文件夾,遞歸調(diào)用自身
                    delFile(file.getPath());
                }
            }
        }
    }
    private static void isFileAndDeleteFile(File file) throws IOException {
        String md5 = MD5Util.getFileMD5String(file).toString();            //取得該文件的MD5值
        if (md5List.size() > 0) {                         //如果存放md5值的數(shù)組不為空
            for (String s : md5List) {
                if (md5.equals(s)) {                    //如果數(shù)組中有了和該文件md5z值相同的項(xiàng),表明該文件已經(jīng)存在,刪除該文件
                    file.delete();
                    num++;
                    Log.i("size", "文件:" + file.getName() + "和已有文件重復(fù),已被刪除");
                }
            }
            if (file.exists()) {                       //判斷該文件是否存在,如果該文件沒(méi)有被刪除,說(shuō)明沒(méi)有和該文件相同的文件,則把其md5值存入數(shù)組之中
                md5List.add(md5);
            }
        }
    }


}

MD5校驗(yàn)工具:

public class MD5Util {

    /**
     * 默認(rèn)的密碼字符串組合,用來(lái)將字節(jié)轉(zhuǎn)換成 16 進(jìn)制表示的字符,apache校驗(yàn)下載的文件的正確性用的就是默認(rèn)的這個(gè)組合 
     */
    protected static char hexDigits[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
    protected static MessageDigest messagedigest = null;
    static {
        try {
            messagedigest = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }

    public static String getFileMD5String(File file) throws IOException {
        InputStream fis;
        fis = new FileInputStream(file);
        byte[] buffer = new byte[1024];
        int numRead = 0;
        while ((numRead = fis.read(buffer)) > 0) {
            messagedigest.update(buffer, 0, numRead);
        }
        fis.close();
        return bufferToHex(messagedigest.digest());
    }

    private static String bufferToHex(byte bytes[]) {
        return bufferToHex(bytes, 0, bytes.length);
    }

    private static String bufferToHex(byte bytes[], int m, int n) {
        StringBuffer stringbuffer = new StringBuffer(2 * n);
        int k = m + n;
        for (int l = m; l < k; l++) {
            appendHexPair(bytes[l], stringbuffer);
        }
        return stringbuffer.toString();
    }

    private static void appendHexPair(byte bt, StringBuffer stringbuffer) {
        char c0 = hexDigits[(bt & 0xf0) >> 4];// 取字節(jié)中高 4 位的數(shù)字轉(zhuǎn)換  
        // 為邏輯右移,將符號(hào)位一起右移,此處未發(fā)現(xiàn)兩種符號(hào)有何不同  
        char c1 = hexDigits[bt & 0xf];// 取字節(jié)中低 4 位的數(shù)字轉(zhuǎn)換  
        stringbuffer.append(c0);
        stringbuffer.append(c1);
    }
}  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,001評(píng)論 25 709
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯(cuò)誤還是無(wú)法避免 以后資料會(huì)慢慢更新 大...
    數(shù)據(jù)革命閱讀 13,219評(píng)論 2 33
  • Ubuntu的發(fā)音 Ubuntu,源于非洲祖魯人和科薩人的語(yǔ)言,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲de夢(mèng)閱讀 100,630評(píng)論 9 468
  • 父親 寫下父親兩字,就涕淚滂沱,不能自己。十一年來(lái),和父親相關(guān)的字眼、音樂(lè)、影視劇等,我都不敢看不敢聽(tīng)。每年的父親...
    jiangnan2025閱讀 271評(píng)論 6 6
  • 在今年九月份的第二個(gè)星期,我們分手了。還差兩個(gè)星期我們就在一起半年了? 剛分手的時(shí)候你還會(huì)拼命的挽回,或許...
    魚呀閱讀 389評(píng)論 0 0

友情鏈接更多精彩內(nèi)容