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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gaog2zh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值