过滤器
File类中重载的listFiles方法,可以接受指定的过滤器。
在listFiles(FileFilter filter) 也可以接受一个FileFilter过滤器,FilenameFilter过滤器中的accept方法接受两个参数,一个当前文件或文件夹所在的路径,一个是当前文件或文件夹对象的名称。
过滤器就是创建一个类,重写accept方法,制定自己的过滤规则。
过滤器代码:
public class MyFilterb implements FileFilter {
public boolean accept(File pathname) {
//过滤器文件
if(pathname.isFile()){
/*//获取文件名
String name=pathname.getName();
//将文件名转为小写
name=name.toLowerCase();
//判断文件名是否以.txt结尾
boolean flag=name.endsWith(".txt");
return flag;*/
/*上述方法使用相对麻烦一点,可以直接使用方法调用来达到自己的目的,最终获得以.txt结尾的文件*/
return pathname.getName().toLowerCase().endsWith(".txt");
}else{
return false;
}
}
}
代码:
public static void main(String[] args) {
// 明确文件夹位置
File file=new File("E:\io1127");
//获取该文件夹中符合规则的文件
//此处的结果是一个File数组
File[] files=file.listFiles(new MyFilterb());
//遍历
for(File f:files){
System.out.println(f);
}
}
文件过滤流程如下图所示:
pathname的对象是io1127中每一个文件或文件夹
io1127中所有的文件或文件夹当调用listFiles()方法时,会传输一个过滤器对象,过滤器会找到file对象(io1127)下的第一条文件或文件夹传给new MyFilter,然后会找到accept方法传给pathname,此时return true,说明a文件符合条件,把file对象装到File[]中,此时会遍历io1127,如果继续满足条件,继续装到File[]中,File数组就会装满,遍历会得到五条数据
accept方法会对指定路径的文件或文件夹一一进行过滤,只要对File pathname的File对象一一进行筛选,那么返回的值符合条件,那么就过滤。
二.递归
就是在当前方法内自己调用自己的现象。
递归分为两种,直接递归和间接递归。
直接递归称为方法自身调用自己。间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
代码演示:
//栈内存溢出
public static void main(String[] args) {
a();
}
public static void a(){
System.out.println("aa");
a();
}
}
递归的使用是一定要有条件限制的,不能无限制的递归下去,一定要保证它能停下来,否则就会发生栈内存溢出,同时次数也不能太多,要不然也会发生栈内存溢出。
递归例子:
public static void main(String[] args) {
System.out.println(get(10));
}//计算1-100和
//规律:100+(100-1)+(99-1)+(98-1)+(97-1)...1
public static int get(int n){
if(n==1){
return 1;
}
return n+get(n-1);
}
//斐波那契数列 1 1 2 3 5 8 13 依次增加
public static int create(int n){
if(n==1){
return 1;
}
if(n==2){
return 1;
}
return create(n-1)+create(n-2);
}
图解示例:
递归要找到规律才可以方便使用,找不到相应的规律,是无法进行写代码的