1. 程式人生 > >java實現遍歷檔案目錄,並在控制檯以樹形結構展示

java實現遍歷檔案目錄,並在控制檯以樹形結構展示

package www.tree.cn;

import java.io.File;

/**
 * @Author:DAVEZJ
 * @Date: Created in 18:07 2018/10/27
 * @E-Mail:
 * 一個用java遍歷檔案目錄,並且在控制檯以樹形結構的方式展開搜尋的檔案
 */


public class treeALL {
    static int dirs = 0;//定義的變數用於存放統計出來的目錄數量和檔案數量
    static int files = 0;
    static long dirLength = 0;//定義的變數用於存放統計出來的目錄大小和檔案大小
    static long fileLength = 0;
    static String preStr = "";//定義縮排量,用於以樹形結構展現層級
    File f = null;

    treeALL(File f) {
        this.f = f;
    }

    public void tree(File f, int level) {
        /**
         * 由於全域性變數在程式銷燬之前,
         變數就會一直儲存在記憶體中,這樣就會導致上一次運算的值保留了下來,
         再次執行方法的時候就會將值累加,
         這樣會導致即使在同一級目錄下的檔案也會呈現樹形分級,
         因此,此處要定義一個區域性變數,
         每次執行的時候更新相應的全域性變數,因為區域性變數在方法每次執行完的時候被銷燬,
         也就是說每次執行該方法的時,這個區域性變數都不一定是相同的值,這樣就避免了累加
         */
        String preStr = "";
        this.preStr = preStr;
        for (int i = 0; i < level; i++) {
            //判斷level的層級數,每多一層就新增一個間隔
            preStr += "\t";
        }
        //定義檔案陣列,用存放獲取到的檔案目錄和檔案
        File[] childs = f.listFiles();//listFiles()方法是返回某個目錄下所有檔案和目錄的絕對路徑,返回的是File陣列
        for (int i = 0; i < childs.length; i++) {
            //用for 迴圈一個個取出來
            //childs[i].isDirectory()用於判斷取取出來的file是檔案還是目錄,然後執行相應的操作
            if (childs[i].isDirectory()) {
                dirs++;//獲取一個目錄就自加一次,記錄數量
            } else {
                files++;//獲取一個檔案就自加一次,記錄數量
                fileLength = childs[i].length();//該檔案的大小(位元組數)
                dirLength += childs[i].length();//將獲取到的每個檔案的大小(位元組數)加起來,記錄整個目錄位元組數
            }
            if (!childs[i].isDirectory()) {
                //列印搜尋出的檔案和目錄,如果是檔案就顯示檔案位元組數
                System.out.println(preStr + childs[i].getName() + "    " + fileLength + "位元組");
            } else {
                System.out.println(preStr + childs[i].getName());
                System.out.println(preStr + "-------------------------");
            }
            if (childs[i].isDirectory()) {
                //判斷是否為目錄,如果是,再次執行tree()方法,將子目錄裡面的檔案再次遍歷出來
                tree(childs[i], level + 1);
            }
        }
    }

    public static void main(String[] args) {
        //給出指定目錄
        File f = new File("G:/Download");
        treeALL t = new treeALL(f); //列印指定目錄,即最頂層目錄
        System.out.println("目標目錄:" + f.getName());
        //開始遍歷目錄
        t.tree(f, 1);
        System.out.println("==============================");
        //列印目錄數量和位元組數
        System.out.println("這個目錄中共:" + dirs + "個目錄");
        //列印檔案數量和位元組數
        System.out.println("這個目錄中有:" + files + "個檔案" + "  " + "共" + dirLength + "位元組");
        //System.out.println("==============================");
    }
}