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()方法

2.1 获取指定目录中的所有File对象

2.2 遍历得到每一个File对象

2.3 判断当前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对象

2.1 通过FilenameFilter过滤器获取指定目录中的所有.java类型的File对象

2.2 遍历得到每一个File对象

2.3 判断当前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");
	}
}

 

递归注意实现

  1. 要有出口,否则就是死递归
  2. 次数不能太多,否则就内存溢出

File: 文件和目录路径名的抽象表示形式

  1. 构造方法:

public File(String pathname) 通过给定的文件或文件夹的路径,来创建对应的File对象

public File(String parent, String child) 通过给定的父文件夹路径,与给定的文件名称或目录名称来创建对应的File对象

public File(File parent,  String child)通过给定的File对象的目录路径,与给定的文件夹名称或文件名称来创建对应的File对象

  1. 路径的分类:

    绝对路径, 带盘盘符

  E:\Workspace\day20_File\abc.txt

相对路径, 不带盘符

day20_File\abc.txt

注意: 当指定一个文件路径的时候,如果采用的是相对路径,默认的目录为 项目的根目录

方法

public boolean createNewFile()创建文件

  1. 返回值为true, 说明创建文件成功
  2. 返回值为false,说明文件已存在,创建文件失败

public boolean mkdir() 创建单层文件夹

创建文件夹成功,返回 true

创建文件夹失败,返回 false

public boolean mkdirs() 创建多层文件夹

public boolean delete()

删除此抽象路径名表示的文件或目录。

如果此路径名表示一个目录,则该目录必须为空才能删除

public boolean isDirectory() 判断是否为文件夹

public boolean isFile() 判断是否为文件

public boolean exists() 判断File对象对应的文件或文件夹是否存在

public String getAbsolutePath() 获取当前File的绝对路径

public String getName() 获取当前File对象的文件或文件夹名称

public long length() 获取当前File对象的文件或文件夹的大小(字节)

public File[] listFiles() 获取File所代表目录中所有文件或文件夹的绝对路径

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值