1. 程式人生 > >java之IO流(遞迴)

java之IO流(遞迴)

一.遞迴的概述

遞迴,指在當前方法內呼叫自己的這種現象

public void method(){
    System.out.println(“遞迴的演示”);
    //在當前方法內呼叫自己
    method();
}

遞迴分為兩種,直接遞迴和間接遞迴。

直接遞迴稱為方法自身呼叫自己。間接遞迴可以A方法呼叫B方法,B方法呼叫C方法,C方法呼叫A方法。

 

遞迴的程式碼演示,計算1-n之間的和,使用遞迴完成

public class DiGuiDemo {
    public static void main(String[] args) {
        
//計算1~num的和,使用遞迴完成 int n = 5; int sum = getSum(n); System.out.println(sum); } public static int getSum(int n) { if(n == 1){ return 1; } return n + getSum(n-1); } }

 

程式碼執行流程圖解

 

 

注意:遞迴一定要有條件限定,保證遞迴能夠停止下來,否則會發生棧記憶體溢位。

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

二.遞迴列印所有子目錄中的檔案路徑

編寫一個方法用來列印指定目錄中的檔案路徑,並進行方法的呼叫

要求:若指定的目錄有子目錄,那麼把子目錄中的檔案路徑也打印出來

步驟:

1. 指定要列印的目錄File物件

2. 呼叫getFileAll()方法

①獲取指定目錄中的所有File物件

②遍歷得到每一個File物件

③判斷當前File 物件是否是目錄

判斷結果為true,說明為目錄,通過遞迴,再次呼叫步驟2的getFileAll()方法

判斷結果為false,說明是檔案,列印檔案的路徑

 

public
class FileDemo2 { public static void main(String[] args) { File file = new File("d:\\test"); getFileAll(file); } //獲取指定目錄以及子目錄中的所有的檔案 public static void getFileAll(File file) { File[] files = file.listFiles(); //遍歷當前目錄下的所有檔案和資料夾 for (File f : files) { //判斷當前遍歷到的是否為目錄 if(f.isDirectory()){ //是目錄,繼續獲取這個目錄下的所有檔案和資料夾 getFileAll(f); }else{ //不是目錄,說明當前f就是檔案,那麼就打印出來 System.out.println(f); } } } }

 

三.搜尋指定目錄中的.java檔案(含子目錄)

 

需求:列印指定目錄即所有子目錄中的.java檔案的檔案路徑

 

要求:編寫一個方法用來列印指定目錄中的.java檔案路徑,並進行方法的呼叫

 

若指定的目錄有子目錄,那麼把子目錄中的.java檔案路徑也打印出來

 

步驟:

 

1. 指定要列印的目錄File物件

 

2. 呼叫getFileAll()方法,傳入要列印的目錄File物件

 

①通過FilenameFilter過濾器獲取指定目錄中的所有.java型別的File物件

 

②遍歷得到每一個File物件

 

③判斷當前File 物件是否是目錄

 

判斷結果為true,說明為目錄,通過遞迴,再次呼叫步驟2的getFileAll()方法

 

判斷結果為false,說明是檔案,列印檔案的路徑

四.實現程式碼步驟

//測試類
public class FileDemo4 {
    public static void main(String[] args) {
        File file = new File("d:\\test");
        getFileAll(file);
    }
    //獲取指定目錄以及子目錄中的所有的檔案
    public static void getFileAll(File file) {
        File[] files = file.listFiles(MyFileFilter());
        //遍歷當前目錄下的所有檔案和資料夾
        for (File f : files) {
            //判斷當前遍歷到的是否為目錄
            if(f.isDirectory()){
                //是目錄,繼續獲取這個目錄下的所有檔案和資料夾
                getFileAll(f);
            }else{
                //不是目錄,說明當前f就是檔案,那麼就打印出來
                System.out.println(f);
            }
        }
    }
}
//自定類繼承FilenameFilter過濾器介面
//定義類實現檔名稱FilenameFilter過濾器
class MyFileFilter implements FilenameFilter{
    public boolean accept(File dir, String name) {
        return name.endsWith(".java");
    }
}