java複習第7天---7.4---IO流---遞歸、文件過濾器
目錄
內容
1、遞歸
1.1、遞歸概述和分類
-
遞歸:在方法內調用自己
-
遞歸分類
- 遞歸分爲直接遞歸和間接遞歸
- 直接遞歸:方法內直接調用自己
- 間接調用:方法A 調用B,方法B調用C,方法C調用A
-
注意事項:
- 遞歸需要有限定條件,保證遞歸能夠停下來,否則會發生棧內存溢出
- 雖然遞歸有限定條件,但是遞歸次數不能太多,否則也會發生內存溢出
- 構造方法,禁止遞歸
-
示例1.1-1:求n的階乘 n! = 1 * 2 * 3 * … * n
package func.digui; public class TestDigui1 { public static void main(String[] args) { // 計算n的階乘 1*2*3*...*n int n = 10; System.out.println(n + "! = " + method(n)); } public static long method(int n) { if(n == 1) return 1; return n * method(n - 1); } } 測試結果: 10! = 3628800
+示例1.1-2:遞歸打印多級目錄
package io.file;
import java.io.File;
public class TestFileDigui {
public static void main(String[] args) {
String parent = "f:\\test";
File file = new File(parent);
printDir(file, 1);
}
public static void printDir(File file, int level) {
for(int i = 0; i < level; i++) {
System.out.print("-");
}
System.out.println(file.getName());
if(file.isDirectory()) {
File[] files = file.listFiles();
for(File x: files) {
printDir(x, level + 1);
}
}
}
}
測試結果:
-test
--a.txt
--b
---c
----d
--b.txt
--c.java
--d.bmp
--hello
--src
-
示例1.1-3:搜索所有.java文件
package io.file; import java.io.File; public class TestFileDigui2 { public static void main(String[] args) { String parent = "f:\\test"; File file = new File(parent); searchJava(file); } public static void searchJava(File file) { if(file.isDirectory()) { File[] files = file.listFiles(); for(File x: files) { searchJava(x); } }else { if(file.getName().endsWith(".java")) { System.out.println(file.getAbsolutePath()); } } } } 測試結果: f:\test\c.java f:\test\hello\HelloWorld.java
2、過濾器
File類中有2個和listFiles重載的方法,方法參數爲過濾器。
- public Files[] listFiles(FileFilter filter):遍歷抽象路徑名符合過濾器規則的File對象
- public Files[] listFiles(FilenameFilter filter):遍歷抽象路徑名符合過濾器規則的File對象
FileFilter和FilenameFilter接口都沒有實現類,如果需要使用需要自定義實現。
-
FileFilter接口:
- 唯一抽象方法:public boolean accept(File pathname)
- File pathname: 使用listFiles遍歷目錄得到的每一個File對象
-
FilenameFilter接口:
- 唯一抽象方法:public boolean accept(File dir, String name)
- File dir:需要遍歷的目錄
- String name:listFiles遍歷 dir目錄得到的每一個文件/目錄名稱
-
示例2-1:搜索F:\test目錄下所有的.java文件,FileFilter過濾器+ lambda表達式實現
package io.file; import java.io.File; import java.io.FileFilter; public class TestFileDigui3 { public static void main(String[] args) { String parent = "f:\\test"; File file = new File(parent); searchJava(file); } // 搜索java文件 public static void searchJava(File file) { File[] filelist = file.listFiles(filepath->filepath.isDirectory() || filepath.getName().toLowerCase().endsWith(".java")); for(File x: filelist) { if(x.isDirectory()) searchJava(x); else System.out.println(x.getAbsolutePath()); } } } 測試結果: f:\test\c.java f:\test\hello\HelloWorld.java
-
示例2-2:搜索F:\test目錄下所有的java文件,FilenameFilter + lambda實現
package io.file; import java.io.File; public class TestFileDigui4 { public static void main(String[] args) { String parent = "f:\\test"; File file = new File(parent); searchJava(file); } // 搜索java文件 public static void searchJava(File file) { File[] filelist = file.listFiles((dir, name)->new File(dir, name).isDirectory() || name.toLowerCase().endsWith(".java")); for(File x: filelist) { if(x.isDirectory()) searchJava(x); else System.out.println(x.getAbsolutePath()); } } } 測試結果: f:\test\c.java f:\test\hello\HelloWorld.java
後記 :
本項目爲參考某馬視頻開發,相關視頻及配套資料可自行度娘或者聯繫本人。上面爲自己編寫的開發文檔,持續更新。歡迎交流,本人QQ:806797785
前端項目源代碼地址:https://gitee.com/gaogzhen/vue-leyou
後端JAVA源代碼地址:https://gitee.com/gaogzhen/JAVA