一,递归
递归:指在当前方法内调用自己的这种现象。
递归使用前提:当调用方法的时候,方法的主体不变,每次调用方法的参数不同,可以使用递归。
递归的分类:递归分为两种,直接递归和间接递归。
1,直接递归称为方法自身调用自己。
2,间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
注意事项:
1,递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
2,在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
3,构造方法,禁止递归。否则会出现编译报错。构造方法是创建对象使用的,一直递归会导致内存中有无数多个对象,故直接编译报错。
public class SumRecursion {
public static void main(String[] args) {
int res = sum(3);
System.out.println(res);
}
private static int sum(int i) {
if (i == 1){
return 1;
}
return i + sum(--i);
}
}
二,文件过滤器
在File类中有两个listFiles重载的方法,方法的参数传递的就是过滤器。
1,File[] listFiles(FileFilter filter)
java.FileFilter接口:用于判断抽象路径名(File对象)是否符合规则的过滤器。
作用:用来过滤文件(File对象)。
接口中的抽象方法:
boolean accept(File pathname):测试指定抽象路径名是否应该包含在某个路径名列表中。
参数:pathname,使用listFiles遍历目录,得到的每一个文件对象。
2,File[] listFiles(FilenameFilter filter)
java.io.FilenameFilter接口:实现此接口的类实例可用于过滤文件名。
作用:用于过滤文件名称。
抽象方法:
boolean accept(File dir, String name):测试指定文件是否应该包含在某一文件列表中。
参数:
File dir:构造方法中传递的被遍历的目录。
String name:使用listFiles方法遍历目录,获取的每一个文件/文件夹的名称。
注意:两个过滤器接口是没有实现类的,需自己重写实现类,重写过滤方法accept(),在方法中自己定义过滤规则。
import java.io.File;
import java.io.FileFilter;
public class FileFilterImpl implements FileFilter {
@Override
public boolean accept(File pathname) {
return pathname.getPath().toLowerCase().endsWith(".txt") || pathname.isDirectory();
}
}
public class FileNameFilterImpl implements FilenameFilter {
@Override
public boolean accept(File dir, String name) {
return new File(dir,name).isDirectory()||name.toLowerCase().endsWith(".txt");
}
}
import java.io.File;
public class DemoFileFilter {
public static void main(String[] args) {
File file = new File("E:\\ab");
printAllFiles(file);
}
private static void printAllFiles(File file) {
//System.out.println(file);
// File[] files = file.listFiles(new FileFilterImpl());
File[] files = file.listFiles(new FileNameFilterImpl());
for (File file1 : files) {
if (file1.isFile()){
String path = file1.getPath();
if (path.toLowerCase().endsWith(".txt")){
System.out.println(file1);
}
}else{
printAllFiles(file1);
}
/*
E:\ab\a\a1\aa.txt
E:\ab\a\a1.txt
E:\ab\b\bb.txt
E:\ab\cc.txt
E:\ab\dd.txt
*/
}
}
}