io流--递归
递归:
自己调用自己:
递归,指在当前方法内调用自己的这种现象
递归分为两种,直接递归和间接递归。
直接递归称为方法自身调用自己。间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
public static void main(String[] args) { a(); } //递归 /* 注意事项 *1.必须有出口,否则无意义 * 2.构造方法不能递归 * 3.递归的次数不能过多(内存有限) * */ public static void a(){ a(); } }
注意:递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
public static void main(String[] args) { // 用递归计算1-100的和 int sum=get(100); System.out.println(sum); int con=getn(5); System.out.println(con); } public static int get(int n){ if(n==1){ return 1; } return n+get(n-1); } public static int getn(int a){ if(a==1){ return 1; } return a*getn(a-1); }
斐波那契数列
public static void main(String[] args) { // TODO Auto-generated method stub int sum =get(12); System.out.println(sum); } public static int get(int n){ //出口 判断条件是最后的出口 if(n==1){ return 1; } if(n==2){ return 1; } return get(n-1)+get(n-2); } } 结果:144
递归打印所有子目录中的文件路径
步骤:
1. 指定要打印的目录File对象
2. 调用getFileAll()方法
2.1 获取指定目录中的所有File对象
2.2 遍历得到每一个File对象
2.3 判断当前File 对象是否是目录
判断结果为true,说明为目录,通过递归,再次调用步骤2的getFileAll()方法
判断结果为false,说明是文件,打印文件的路径
package com.oracle.demo01; import java.io.File; public class demo05 { public static void main(String[] args) { File file=new File("D:\\demo0611"); getFile(file); } public static void getFile(File file){ //打印文件夹名 System.out.println(file); //获取改目录下的所有文件和文件加 File[] files= file.listFiles(); //便利 for(File f:files){ //判定- if(f.isDirectory()){ //-如果是文件夹就继续打印 getFile(f);//继续调用(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,说明是文件,打印文件的路径
1.1 实现代码步骤
l 测试类 publicclass FileDemo4 { publicstaticvoid main(String[] args) { File file = new File("d:\\test"); getFileAll(file); } //获取指定目录以及子目录中的所有的文件 publicstaticvoid getFileAll(File file) { File[] files = file.listFiles(MyFileFilter()); //遍历当前目录下的所有文件和文件夹 for (File f : files) { //判断当前遍历到的是否为目录 if(f.isDirectory()){ //是目录,继续获取这个目录下的所有文件和文件夹 getFileAll(f); }else{ //不是目录,说明当前f就是文件,那么就打印出来 System.out.println(f); } } } } l 自定类继承FilenameFilter过滤器接口 //定义类实现文件名称FilenameFilter过滤器 class MyFileFilter implements FilenameFilter{ publicboolean accept(File dir, String name) { return name.endsWith(".java"); } }