2021-09-11 File&递归&Lambda表达式

目录

一、java.io.File

1、路径

2、File属性常用方法:

3、File创建常用方法:

4、List;FileFilter

二、递归

三、lambda表达式:

不使用lambda表达式时

使用lambda表达式时

lambda表达式可以简写


一、java.io.File

File类的每一个实例用于表示硬盘上的一个文件或目录,使用File可以:
1.访问该文件或目录是属性信息 名字大小,修改时间等
2.创建或删除文件或目录
3.访问一个目录中的所有子项
但是使用File不能读写文件中的数据,有其他API可以做到


1、路径

创建File对象需要指定其表示的文件夹目录的路径和信息,路径有两种写法:
① 绝对路径:从盘符开始,例如:D:\home\FYX_Month01_Week03\src\com\fyx\day05
② 相对路径,根据当前位置确定,例如:"./demo.txt"。其中.代表当前目录 ..代表上级目录
---
区别:
绝对路径的优点在于清晰明了,缺点在于位置是固定的,不利于跨平台。如果项目位置发生改变,存在找不到文件的风险。
相对路径的优点在于适应性好,利于跨平台。缺点是不清晰,需要是当前程序的运行环境而定。
在Eclipse/idea等开发工具中,当前目录的位置就是当前程序所在的目录。

2、File属性常用方法:

 ① [String] getName() 获取文件名
 ② [long] length() 获取文件的长度 --字节数
 ③ [boolean] canRead() 是否可读
   [boolean] canWrite() 是否可写
 ④ [boolean] isHidden() 是否隐藏


3、File创建常用方法:

 ① [boolean] exist() 判断文件是否存在或目录是否存在
 ② [boolean] createNewFile() 当且仅当该File对象表示的文件不存在时, 创建一个
 ③ [boolean] mkdir() 当且仅当该File对象表示的目录不存在时,创建当前File对象所表示的目录,要求创建的目录所在的目录必须存在,否则创建不成功。
 ④ [boolean] mkdirs() 创建该File指定的目录,包括所有必须但是不存在的父类目录。

4、List;FileFilter

 ① [boolean] isFile() 判断当前File是否表示一个文件
 ② [boolean] isDirectory() 判断是否为一个目录
 ③ [String数组] list() 获取该File对象表示的目录下所有文件
 ④ [File数组] listFiles() 获取该File对象所表示的目录下所有子项,每个子项都以一个File对象的形式表示,最终以数组的形式返回
 ⑤ listFiles()有一个重载方法,允许我们传入一个文件过滤器FileFilter,然后将该目录中符合过滤器要求的子项获取出来。

二、递归

在方法内部调用方法本身,节省代码量,但效率不高

public static void delDirs (File dir){
        //1.获取目标数组中的所有子项
        File[] subs = dir.listFiles();
        //2.遍历数组,获取每个子项
        for (int i = 0; i < subs.length; i++) {
            //3.判断该子项是文件还是目录,如果是文件直接删除
            if(subs[i].isFile()){
                subs[i].delete();
            }else{//如果是目录,需要再获取遍历判断……
                delDirs(subs[i]);//递归,重复之前做的1 2 3
            }
        }
        dir.delete();//删除空目录
    }

过程:

2021-09-11 File&递归&Lambda表达式_第1张图片

假如还有别的文件:

2021-09-11 File&递归&Lambda表达式_第2张图片

 

三、lambda表达式:

JDK8后推出了一个新特性:lambda表达式
lambda表达式可以用更简洁的语法创建匿名内部类。
语法:(参数列表) ->{ 方法体 }
需要注意的是,使用lambda表达式创建时必须是接口的实现类,而且注意实现的接口中只能有一个抽象方法(普通方法不耽误)。


不使用lambda表达式时

只能使用匿名内部类创建接口的实现类对象
       

 //使用匿名内部类的方式创建文件过滤器:
        File file = new File("./src/com/fyx");
        FileFilter filter = new FileFilter() {
            @Override
            public boolean accept(File file) {
                return file.getName().contains("days");
            }
        };

使用lambda表达式时

编译器会结合程序的语义分析出实现的是哪个结构,由于要求接口中只能有一个抽象方法,所以也能知道重写的方法名是什么,最终会将它还原为匿名内部类。

        //使用lambda表达式创建:
        FileFilter filter1 = (File file1)->{
            return file1.getName().contains("days");
        };

lambda表达式可以简写

参数名可以不写,当方法中只有一句代码时,方法体的{}可以忽略不写,并且如果该方法要求返回值,则return关键字也要一起省略。

        //进一步省略::参数名可以不写
        FileFilter filter2 = (file2)->{
            return file2.getName().contains("days");
        };
        //进进一步省略:: { }和返回值可以成对不写
        FileFilter filter3 = (file3)->file3.getName().contains("days");


        


 

你可能感兴趣的:(Java,API,Java学习,eclipse,java,struts)