java複習第7天---7.4---IO流---遞歸、文件過濾器

java複習第7天---7.4---IO流---遞歸、文件過濾器


目錄




內容

1、遞歸

1.1、遞歸概述和分類

  • 遞歸:在方法內調用自己

  • 遞歸分類

    • 遞歸分爲直接遞歸和間接遞歸
    • 直接遞歸:方法內直接調用自己
    • 間接調用:方法A 調用B,方法B調用C,方法C調用A
  • 注意事項:

    1. 遞歸需要有限定條件,保證遞歸能夠停下來,否則會發生棧內存溢出
    2. 雖然遞歸有限定條件,但是遞歸次數不能太多,否則也會發生內存溢出
    3. 構造方法,禁止遞歸
  • 示例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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章