java之IO流(遞迴)
阿新 • • 發佈:2019-01-02
一.遞迴的概述
遞迴,指在當前方法內呼叫自己的這種現象
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");
}
}