迭代及用遞迴遍歷File檔案

crazy韓先森發表於2020-12-14

遞迴:指的是當前方法呼叫自己的一

遞迴的分類

  • 遞迴分為兩類:直接遞迴和間接遞迴

  • 直接遞迴:稱為方法自身呼叫自己的情況

  • 間接遞迴:可以歸結為:方法A呼叫了方法B,方法B呼叫了方法C,方法C反過來又呼叫了方法A。

種現象。

注意事項

  • 遞迴一定要有邊界條件 (條件限定),保證遞迴能夠停止下來,否則會發生棧記憶體溢位。

  • 在遞迴當中雖然有限定條件,但是遞迴的次數也不能太多,否則也會發生棧記憶體溢位現象。

  • 構造方法禁止遞迴。

 遞迴例項程式碼:

1.計算1~n的和

public int  sum(int n){
  
   //設定邊界條件
  if(n==1){
   return 1;
  }
  
  return n+sum(n-1);//遞迴呼叫自己
}

圖解:

2.遞迴求階乘

階乘:所有小於及等於該數的正整數的乘積。

n的階乘:n! = n * (n-1) * (n-2) * (n-3) * ... * 3 * 2 * 1

public int  sum1(int n){
  
   //設定邊界條件
  if(n==1){
   return 1;
  }
  
  return n*sum1(n-1);//遞迴呼叫自己
}

3.遞迴列印檔案多級目錄:

 

 public static void main(String[] args) {
        // 找到Hello檔案的路徑
        File file = new File("C:\\Users\\admin\\Desktop\\Hello");
        //呼叫getAllFiles()
        getAllFiles(file);
    }

    /*
        定義一個方法,引數傳遞File型別的目錄
        方法中要對目錄進行遍歷
     */
    public static void getAllFiles(File file) {
        // 表明file此時是一個目錄
        System.out.println(file);
        //首先先獲取到它直接子目錄和直接子檔案
        File[] files = file.listFiles();
        // 遍歷files目錄
        for (File f : files) {
            // 判斷如果得到的f是一個目錄,需要再次遍歷
            if (f.isDirectory()) {
                // 表明f是一個目錄,則繼續遍歷這個目錄
                //getAllFiles方法就是獲取所有的檔案,引數傳遞的剛好是目錄。所以直接呼叫getAllFiles:遞迴(自己呼叫自己)
                getAllFiles(f);
            } else {
                // 此時f不是一個目錄,肯定是一個檔案
                System.out.println(f);
            }
        }
    }

4.檔案搜尋:

        C:\Users\admin\Desktop\Hello目錄中的所有的.txt檔案

public static void main(String[] args) {
        //構建一個File物件得到C:\Users\admin\Desktop\Hello路徑
        File file = new File("C:\\Users\\admin\\Desktop\\Hello");
        getAllTxt(file);
    }

    /*
        定義一個方法,遍歷所有的.txt檔案
        方法中依然需要傳引數目錄
     */
    public static void getAllTxt(File dir) {
        //System.out.println(dir);
        File[] files = dir.listFiles();
        //遍歷files
        for (File f : files) {
            // 判斷f是否是一個目錄
            if (f.isDirectory()) {
               //遞迴呼叫自己
                getAllTxt(f);
            } else {
                // 先獲取檔案的名稱
               /* String name = f.getName();
                //String path = f.getPath();
                 // 大寫字串轉換成小寫   (windows系統預設不區分大小寫,linux系統區分大小寫)
                 name = name.toLowerCase();
                // 再次判斷名稱是否以.txt結尾
                if (name.endsWith(".txt")) {
                    System.out.println(f);
                }*/
                // 鏈式程式設計
                if (f.getName().toLowerCase().endsWith(".txt")) {
                    System.out.println(f);
                }
            }
        }
    }

5.檔案過濾器遍歷搜尋指定檔案

  java.io.FileFilter是一個介面,是File的過濾器,該介面的物件可以傳遞給File類的listFiles(FileFilter)作為引數,介面當中只有一個方法:

  boolean accept(File pathname):測試pathname是否應該包含在當前的File目錄中,如果符合返回true。

 public static void main(String[] args) {
        //構建一個File物件得到C:\Users\admin\Desktop\Hello路徑
        File file = new File("C:\\Users\\admin\\Desktop\\Hello");
        getAllTxt(file);
    }
    /*
        定義一個方法,遍歷所有的.txt檔案
        方法中依然需要傳引數目錄
     */
    public static void getAllTxt(File dir) {
        //System.out.println(dir);
        //File[] files = dir.listFiles();
        File[] files = dir.listFiles(new FileFilterImpl());
        //遍歷files
        for (File f : files) {
            // 判斷f是否是一個目錄
            if (f.isDirectory()) {
                getAllTxt(f);
            } else {
                // 先獲取檔案的名稱
                System.out.println(f);
            }
        }
    }
// 實現類中的程式碼
 @Override
public boolean accept(File pathname) {
    if (pathname.isDirectory()) {
        return true;
    }
    return pathname.getName()
        .toLowerCase()
        .endsWith(".txt");
}

  程式碼優化:

 

        //匿名類優化
        File[] files = file.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                if (pathname.isDirectory()) {
                    return true;
                }
                return pathname.getName().toLowerCase().endsWith(".txt");
            }
        });
      

  //lambda表示式優化
        File[] files1 = file.listFiles(pathname -> pathname.getName().toLowerCase().endsWith(".txt") || pathname.isDirectory());
        for (File file1 : files) {
            if (file1.isDirectory()) {
                file2(file1);
            } else {
                System.out.println(file1.getAbsolutePath());

            }
        }

 

相關文章