天天看點

使用Java統計某個目錄下各種類型檔案的數量

在日常工作中經常會統計一些資料,下面介紹一個例子,如何統計某個目錄下邊各種檔案類型的檔案數量。

本例子使用到了遞歸的算法,字元串的常用運算,檔案的處理以及集合類的使用。是一個比較好的學習例子。

/**
 * 統計某個目錄下所有各種檔案類型的數量
 */
public class StaticFile {

    public static void main(String[] args) {
        /**
         *
         */
        HashMap<String ,FileCnt> myFilemap = new HashMap<String ,FileCnt>();
        staticFile(myFilemap,"D:\\untitled");
        myFilemap.forEach((x,y)->{
            System.out.println("filetype : " +x + " num :" + y );
        });
    }

    /**
     *
     * @param fileMap
     * @param filePath
     */
    static void  staticFile(HashMap<String ,FileCnt> fileMap,String filePath ){

        File file = new File(filePath);
        if (file.exists()){
            // 如果是目錄 則遞歸調用
            if(file.isDirectory()){
                String[] list = file.list();
                for (String afile:list) {
                    staticFile(fileMap,filePath + "\\" + afile );
                }
                // 如果是檔案 則處理map集合中的資料
            }else {

                // 擷取擴充名 以及檔案名稱
                int lastgg  = filePath.lastIndexOf("\\");
                if (lastgg <=0 )
                    return;
                // 得到檔案的名稱
                String fileName = filePath.substring(lastgg+1);
                // 沒有擴充名的情況
                String suffix = "notype";

                //擷取擴充名
                if(fileName.lastIndexOf('.')>0){
                    try {
                        suffix = fileName.substring(fileName.lastIndexOf('.' )+1);
                    }catch (StringIndexOutOfBoundsException e){
                        System.out.println("filename error : " + fileName);
                    }
                }
                // 如果該類型已經存在于map中
                // 則原有的基礎之上自增
                // 否則建立新的對象儲存在map中
                if (fileMap.get(suffix)==null){
                    fileMap.put(suffix,new FileCnt(suffix,1));
                }else{
                    fileMap.get(suffix).increaseNum();
                }
            }
        }

    }
}

/**
 * 儲存檔案類型與數目的結構
 */
class  FileCnt{
    String suffix;// 擴充名
    int num;// 檔案的個數

    @Override
    public String toString() {
        return "FileCnt{" +
                "suffix='" + suffix + '\'' +
                ", num=" + num +
                '}';
    }

    public FileCnt(String suffix, int num) {
        this.suffix = suffix;
        this.num = num;
    }

    public String getSuffix() {

        return suffix;
    }

    public void setSuffix(String suffix) {
        this.suffix = suffix;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public void increaseNum() {
        this.num++;
    }
}