首頁技術文章正文

Java培訓:不使用遞歸實現文件夾的遍歷

更新時間:2022-09-15 來源:黑馬程序員 瀏覽量:

  大家好,這篇文章為大家介紹一下怎樣遍歷電腦上的一個文件夾。

   通常遍歷文件夾我們都是使用遞歸進行操作,這種方式比較簡單,也比較容易理解,本文的第一種實現也是使用遞歸。然后再為大家介紹另一種不使用遞歸的方式,只用到了循環(huán)和集合,這種方式由于沒有使用遞歸,所以效率更高一些!

  一、使用遞歸遍歷文件夾

  1.1 實現思路

   整體思路:

   1). 使用File封裝初始目錄。

   2). 打印這個目錄。

   3). 獲取這個目錄下所有的子文件和子目錄的數組。

   4). 遍歷這個數組,取出每個File對象

   5).判斷這個File是否是一個文件,是:

   打印

   6).否則(就是一個目錄):

   遞歸調用(從步驟2到這里,就可以形成一個遞歸方法)

  1.2 代碼實現

public class Demo{
    public static void main(String[] args){
        //1).使用File封裝初始目錄
        File dir = new File("d:\\多級目錄");
        //調用遞歸方法
        searchFile(dir);
    }
    //遞歸方法
    public static void searchFile(File dir){
        //2).打印這個目錄
        System.out.println(dir.getAbsolutePath());
        //3). 獲取這個目錄下所有的子文件和子目錄的數組。
        File[] files = dir.listFiles();
        //4). 遍歷這個數組,取出每個File對象
        if(files != null){
            for(File f : files){
                //5).判斷這個File是否是一個文件,是:
                if(f.isFile()){
                    //打印
                    System.out.println(f);
                }else{//6).否則就是一個目錄,繼續(xù)遞歸
                    //遞歸
                    searchFile(f);
                }
            }
        }
    }
   
}

  這種實現方式的核心就是每個目錄都會調用searchFile()方法,而searchFile()方法針對每個目錄的工作都是一樣的:打印目錄、獲取目錄下所偶有的子文件和子目錄的數組、遍歷數組......從而形成了遞歸調用。

   由于遞歸需要再次調用方法,導致方法入棧,從而降低程序的執(zhí)行效率!

  二、不使用遞歸遍歷文件夾

  2.1 實現思路

   不使用遞歸的思路

   (1). 使用File封裝初始目錄。

   (2). 定義一個集合,用于存儲"一個目錄下所有的子文件和子目錄的File對象"。

   (3). 集合中先添加"初始目錄"。

   (4). 循環(huán),條件:集合非空

                        1). 取出,并刪除集合中的索引為0的"File對象"(此File對象可能是文件,也可能是目錄)

                        2). 打印這個File對象。

                        3). 判斷此File對象是否是"目錄",是:

                             獲取此目錄下所有子文件和子目錄的File數組,并添加到這個集合的前面

                        循環(huán)結束

   這個流程用循環(huán)代替了遞歸,每次將目錄的File對象添加到集合,然后再取出,刪除。再獲取這個目錄下所有的子目錄和子文件的數組,并添加到集合,然后再循環(huán)。最終直至把所有文件都取出,并刪除,打印,集合為空,結束循環(huán)。

  2.2 代碼實現

/**
 * 非遞歸遍歷目錄
 * 創(chuàng)建一個List對象,把目錄放到List中
 * 循環(huán)遍歷,每次取出第一個元素,如果是目錄就把目錄中的內容放到List最前面,如果不是目錄只取出即可。
 */
public class SearchDir {
    public static void main(String[] args) {
        File dir = new File("d:\\多級目錄");
        searchDir(dir);
    }

    public static void searchDir(File dir) {
        //定義集合
        List<File> list = new ArrayList<>();
        //將參數dir對象添加到集合
        list.add(dir);
        //循環(huán),條件:集合非空
        while (!list.isEmpty()) {
            //取出,并刪除集合的第一個File對象
            File file = list.remove(0);
            //打印這個File對象
            System.out.println(file.getAbsoluteFile());
            //如果此File對象是一個目錄
            if(file.isDirectory()) {
                //獲取此File對象下所有子文件和子目錄的數組,并添加到集合的前面
                list.addAll(0, Arrays.asList(file.listFiles()));
            }
            //繼續(xù)下一次循環(huán)......
        }
    }
}

  這種方式僅僅用到了集合,沒有使用遞歸,所以占用系統(tǒng)資源較小,效率比較高!是不是很巧妙?大家學會了嗎?

分享到:
在線咨詢 我要報名
和我們在線交談!