File类、递归、文件搜索、文件过滤器优化、Lambda优化

1.1 概述

  • 递归的概念:方法自身调用自身则称为递归。
  • 递归的分类:
  1. 间接递归:方法A调用方法B,方法B调用方法C,方法C调用方法A(在实际开发过程中一般不用
  2. 直接递归:方法A调用方法A
  • 递归的注意事项:
  1. 递归一定要出现出口:结束递归的条件。
  2. 递归次数不要太多。
  • java.lang.StackOverflowError:栈内存溢出错误

1.2 递归求1-n的和

/*
    递归求和:求1-n的和,假设n=5
    sum(5)=1+2+3+4+5=sum(4)+5
    sum(4)=1+2+3+4=sum(3)+4
    sum(3)=1+2+3=sum(2)+3
    sum(2)=1+2=sum(1)+2
    sum(1)=1

    当n>1时,
    sum(n)=sum(n-1)+n;
    当n==1时,sum(1)=1

 */
public class DGDemo01 {
    public static void main(String[] args) {
        System.out.println(sum(1));
        System.out.println(sum(5));
    }
    public static int sum(int n){
        if(n == 1) return 1;
        return sum(n-1)+n;
    }
}

1.3 递归求n的阶层:

/*
    递归求n! : 阶层
    n=5   1*2*3*4*5
    jc(5)=1*2*3*4*5=jc(4)*5
    jc(4)=1*2*3*4=jc(3)*4
    jc(3)=1*2*3=jc(2)*3
    jc(2)=1*2=jc(1)*2
    jc(1)=1

    当n>1时,
    jc(n)=jc(n-1)*n
    当n==1时,jc(1)=1
*/
public class DGDemo01 {
    public static void main(String[] args) {
        System.out.println(jc(1));
        System.out.println(jc(5));
    }
    public static int jc(int n){
        if(n == 1) return 1;
        return jc(n-1)*n;
    }
}

1.4 递归打印多层目录

分析:多级目录的打印,就是当目录的嵌套。遍历之前,无从知道到底有多少级目录,所以我们还是要使用递归实现。

下列代码中:else {
                //file是文件夹
                printFile(file);
            }

当file是文件夹时,就继续调用此方法,即使用了递归

import java.io.File;
/*
    打印指定文件夹下所有文件名
 */
public class DGDemo02 {
    public static void main(String[] args) {
        File f=new File("E:\\Adobe Photoshop CC 2017 SP");
        printFile(f);
    }
    /*
        打印指定文件夹下的所有文件名
     */
    public static void printFile(File dir){
        //获取文件夹下的所有文件,返回数组
        File[] files = dir.listFiles();
        //遍历文件数组
        for(File file:files){
            //判断是否是普通文件
            if(file.isFile()){
                System.out.println(file.getName());
            }else {
                //file是文件夹
                printFile(file);
            }
        }
    }
}

1.5 获得指定文件夹的大小

import java.io.File;

public class DGDemo03 {
    static long size =  0;
    public static void main(String[] args) {
        File f=new File("D:\\暴风影音");
        getdirLength(f);
        System.out.println("size="+size);//size=237375371
    }
    /*
        获得指定文件夹的大小
     */
    public static void getdirLength(File dir){
        //获取文件夹下的所有文件,返回文件数组
        File[] files = dir.listFiles();
        //遍历数组
        for(File file:files){
            //判断是否是普通文件
            if(file.isFile()){
                size += file.length();
            }else {
                getdirLength(file);
            }
        }

    }
}

 1.6  打印指定文件夹下所有的pak文件(.pak结尾)

方式1:

import java.io.File;

/*
    打印指定文件夹下所有的pak文件(.pak结尾)
 */
public class DGDemo04 {
    public static void main(String[] args) {
        //创建文件对象并关联目标文件夹
        File f=new File("D:\\暴风影音\\locales");
        printFileName(f);
    }
    /*
        打印指定文件夹下的pak文件
     */
    public static void printFileName(File dir){
        //获得文件夹下的所有文件,返回文件数组
        File[] files = dir.listFiles();

        //遍历文件数组
        for(File file:files){
            //判断是否是普通文件
            if(file.isFile()){
                //判断是否是以.pak结尾
                if(file.getName().endsWith(".pak")){
                    System.out.println(file.getName());
                }else {
                    printFileName(file);
                }
            }
        }
    }
}

方式2:使用  .切割文件名的方式

切割注意:一定要在.前面加上\\ 因为.在正则表达式中是一个通配符 ,可以匹配任意的字符,每个字符进行切割,把字符串切没了,加上\\之后对.进行转意,使之变成普通的点。
import java.io.File;

/*
    打印指定文件夹下所有的pak文件(.pak结尾)
 */
public class DGDemo04 {
    public static void main(String[] args) {
        //创建文件对象并关联目标文件夹
        File f=new File("D:\\暴风影音\\locales");
        printFileName(f);
    }
    /*
        打印指定文件夹下的pak文件
     */
    public static void printFileName(File dir){
        //获得文件夹下的所有文件,返回文件数组
        File[] files = dir.listFiles();

        //遍历文件数组
        for(File file:files){
            //判断是否是普通文件
            if(file.isFile()){
                //获得文件名
                String fileName = file.getName();
                //使用.切割文件名
                // .在正则表达式中是一个通配符,可以匹配任意的字符,所有本题中需要在.前面加上“\\.”
                String[] strs = fileName.split("\\.");
                //获得文件名后缀
                String extName = strs[1];
                //判断是否.pak结尾
                if(extName.equals("pak")){
                    System.out.println(file.getName());
                }else {
                    printFileName(file);
                }

            }
        }
    }
}

ps:额外补充类似点切割的例子:

public class DGDemo04 {
    public static void main(String[] args) {
        String ip="192.168.23.11";
        String[] ips=ip.split("\\.");
        System.out.println(Arrays.toString(ips));
     }
}



2.1 文件过滤器优化(推荐使用,效率更高): 

  • File类与文件过滤器相关的方法:
  1. File[] listFiles(FileFilter fileFilter);根据指定的文件过滤器获得文件
  • FileFilter接口概述:只要实现了该接口的对象就是一个文件过滤器对象。
  • 重写accept方法的调用时机:
  1. 当系统内部获得到文件夹下的每一个文件或子文件夹时,都会将其封装成文件对象传递给accept方法
  • accept方法返回值的作用:
  1. true:接受该文件,不过滤该文件
  2. false:不接受该文件,过滤掉该文件
import java.io.File;
import java.io.FileFilter;
/*
    自定义过滤器
 */
public class MyFilefilter implements FileFilter {
    @Override
    public boolean accept(File pathname) {
        if(pathname.isDirectory() || pathname.getName().endsWith(".pak")){
            //返回true表示不过滤文件
            return true;
        }else {
            return false;
        }
    }
}




import java.io.File;

public class DGDemo04 {
    public static void main(String[] args) {
        File f=new File("D:\\\\暴风影音\\\\locales");
        printFile(f);
    }
    public static void printFile(File dir){
        //创建文件过滤器对象
        MyFilefilter myFilefilter = new MyFilefilter();
        //获取文件夹下的所有文件,并返回字符数组
        File[] files = dir.listFiles(myFilefilter);

        //遍历数组
        for(File file:files){
            //判断是否是普通文件
            if(file.isFile()){
                    System.out.println(file.getName());
                }else {
                    printFile(file);
                }
            }
        }
}

2.2 Lambda优化

  •  分析:FileFilter是只有一个方法的接口,因此可以用Lambda表达式简写。
  • lambda格式:()->{}

2.2.1使用匿名内部类简化(直接new FileFilter)

  //获取文件夹下的所有文件,并返回字符数组,使用匿名内部类获得文件过滤器对象
        File[] files = dir.listFiles(new FileFilter(){......});

import java.io.File;
import java.io.FileFilter;

public class DGDemo04 {
    public static void main(String[] args) {
        File f=new File("D:\\\\暴风影音\\\\locales");
        printFile(f);
    }
    public static void printFile(File dir){
        //获取文件夹下的所有文件,并返回字符数组,使用匿名内部类获得文件过滤器对象
        File[] files = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                if(pathname.isDirectory() || pathname.getName().endsWith(".pak")){
                    //返回true表示不过滤文件
                    return true;
                }
                return false;
            }
        });

        //遍历数组
        for(File file:files){
            //判断是否是普通文件
            if(file.isFile()){
                    System.out.println(file.getName());
                }else {
                    printFile(file);
                }
            }
        }
}

2.2.2 匿名内部类转为Lambda表达式优化

import java.io.File;
import java.io.FileFilter;

public class DGDemo04 {
    public static void main(String[] args) {
        File f=new File("D:\\\\暴风影音\\\\locales");
        printFile(f);
    }
    public static void printFile(File dir){
        //获取文件夹下的所有文件,并返回字符数组,使用匿名内部类获得文件过滤器对象
       /* File[] files = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                if(pathname.isDirectory() || pathname.getName().endsWith(".pak")){
                    //返回true表示不过滤文件
                    return true;
                }
                return false;
            }
        });*/
        //使用Lambda表达式的标准格式优化
       /* File[] files=dir.listFiles((File file)->{
            if(file.isDirectory() || file.getName().endsWith(".pak")){
            //返回true表示不过滤文件
            return true;
        }
            return false;});*/

        //使用Lambda表达式的简化格式优化
       /* File[] files=dir.listFiles((File file)->{
                //返回true表示不过滤文件
                return file.isDirectory() || file.getName().endsWith(".pak");
           });*/

        //使用Lambda表达式的省略简化格式优化
        File[] files=dir.listFiles(file-> file.isDirectory() || file.getName().endsWith(".pak"));

        //遍历数组
        for(File file:files){
            //判断是否是普通文件
            if(file.isFile()){
                    System.out.println(file.getName());
                }else {
                printFile(file);
            }
        }
    }
}

版权声明:本文为博主原创文章,转载请注明出处。https://mp.csdn.net/postedit/81516351

猜你喜欢

转载自blog.csdn.net/Huangyuhua068/article/details/81516351