Java语言进阶 #文件&IO流 #Day19 #File类 #递归 #过滤器

文章目录

  • 一、File类
    • 1. 四个静态方法
    • 2. 构造方法
    • 3. 常用方法
      • 3.1 获取
      • 3.2 判断
      • 3.3 创建&删除
      • 3.4 遍历目录
  • 二、递归
    • 1. 计算阶乘
    • 2. 递归查看文件夹
      • 2.1 查找特定结尾的文件
    • 3. 过滤器
      • 3.1 过滤器的抽象方法
      • 3.2 过滤器原理及实现
      • 3.3 代码实现(匿名内部类)
      • 3.4 代码实现(Lambda表达式)

一、File类

java.io.file: 文件、目录路径的抽象表示形式
File类是一个与系统无关的类,任何操作系统中都能使用它的方法

1. 四个静态方法

static String pathSeparator  // 与系统有关的路径分隔符(因为方便,被表示为字符串);用来分隔不同路径  Win:分号; Linux/Mac:冒号:
static char pathSeparatorChar
static String separator  // 与系统有关的路径分隔符(因为方便,被表示为字符串);用来分隔路径内各部分 Win:反斜杠\ Linux/Mac:斜杠/
static char separator

Java语言进阶 #文件&IO流 #Day19 #File类 #递归 #过滤器_第1张图片
绝对路径: 以根目录开始的路径,Win的根目录是盘符(如C:),Linux/Mac的根目录是/~
相对路径: 相对于当前位置(当前项目根目录)的路径,.表示当前路径,..表示上一级

注意: 路径不区分大小写。Win中要用\\分隔路径,因为一个\会被认为是转义字符

2. 构造方法

File有三个构造方法

  1. Flie(String 路径名)(路径名可以不是真实存在的,还记得那句话嘛File类是对路径的封装 。可以是相对路径,也可以是绝对路径。)
    Java语言进阶 #文件&IO流 #Day19 #File类 #递归 #过滤器_第2张图片
  2. Flie(String 父路径名, String 子路径名)在这里插入图片描述
  3. Flie(File 父路径名, String 子路径名)
    在这里插入图片描述

3. 常用方法

3.1 获取

  • getPath(): 获取File的路径,FiletoString,就是调用它
  • getAbsolutePath(): 获取File的绝对路径
  • getName(): 获取文件名/目录名(路径结尾部分)
  • length(): 获取文件(文件夹是没有大小概念的,获取文件夹大小将为0)大小(单位:B);如果路径不存在,返回0

Java语言进阶 #文件&IO流 #Day19 #File类 #递归 #过滤器_第3张图片

3.2 判断

  • exists(): 路径是否存在
  • isDirectory(): 目标是否为目录
  • isFile(): 目标是否为文件

Java语言进阶 #文件&IO流 #Day19 #File类 #递归 #过滤器_第4张图片

3.3 创建&删除

  • createNewFile(): 创建一个文件
  • delect(): 删除目标文件/目录(直接在硬盘删除,不走回收站)
  • mkdir(): 创建一个目录
  • mkdirs(): 创建一个目录,会递归地创造不存在的目录

Java语言进阶 #文件&IO流 #Day19 #File类 #递归 #过滤器_第5张图片
Java语言进阶 #文件&IO流 #Day19 #File类 #递归 #过滤器_第6张图片

3.4 遍历目录

这种遍历,可以获得隐藏的文件夹。

  • String[] list(): 返回一个数组,该数组有这个目录文件的遍历
  • File[] listFiles(): 返回一个数组,该数组有这个目录文件的遍历。会把遍历到的文件/目录封装到file文件中,然后放在file[]数组中

如果给出的目录不存在或是个文件,会抛出空指针异常

Java语言进阶 #文件&IO流 #Day19 #File类 #递归 #过滤器_第7张图片

二、递归

递归: 自己调用自己

  • 分类: 直接递归(自己调用)、间接递归(通过其他方法间接调用)

注意事项:

  1. 递归要有基线条件、递归条件
  2. 递归次数不宜过多,以免引起栈内存溢出
  3. 构造方法禁止递归

1. 计算阶乘

怎么利用递归计算阶乘呢?用归纳假设思想

  1. 假定一个函数可以返回 K n ∗ K n − 1 ! K_n * K_{n-1}! KnKn1!的值
  2. 那么它可以返回 K n − 1 ∗ K n − 2 ! K_{n-1} * K_{n-2}! Kn1Kn2!的值
  3. 那么它可以返回 2 ∗ 1 2 * 1 21的值,这当然可以啦!计算阶乘就是我们定义的方法,初始值1设定为基线条件( 2 ∗ 1 2 * 1 21后面的1,是第一个return的结果)。
    Java语言进阶 #文件&IO流 #Day19 #File类 #递归 #过滤器_第8张图片

递归效率低下,但是非常直观

2. 递归查看文件夹

Java语言进阶 #文件&IO流 #Day19 #File类 #递归 #过滤器_第9张图片
个人记录: 我最开始在写代码时,发生了空指针错误,一直以为是file指向了不存在的路径,于是做了判断路径的操作,无效。后来开了断点测试,才想起,对文件遍历也会空指针异常,于是把判断条件改为了判断目录。

2.1 查找特定结尾的文件

把打印函数,换成自定义的判断函数(这样有个好处,就是判断与主体解耦了)
Java语言进阶 #文件&IO流 #Day19 #File类 #递归 #过滤器_第10张图片
但是这样有个问题,File[]数组中存放的,依旧是那么多File,并不只是包含我们需要的。如果需要对取出的类型进行批量处理,那更是复杂(我们只是打印了符合要求的文件名!!!)

3. 过滤器

3.1 过滤器的抽象方法

listFiles有两个重载的形式,新加的参数即为过滤

  1. File[] listFiles(FileFilter filter)
  2. File[] listFiles(FilenameFilter filter)

java.io.FileFilter是用于抽象路径名(File对象)的过滤器

  • 作用: 用来过滤文件
  • 抽象方法:
      boolean accept(File pathname)
      测定指定抽象路径名是否应该包含在某个路径名列表中

java.io.FilenameFilter是用于抽象路径名(File对象)的过滤器

  • 作用: 用来过滤文件名称
  • 抽象方法:
      boolean accept(File dir, String name)
      测定指定文件是否包含在某一文件列表中
      参数:dir被遍历的目录
         name通过listFiles遍历的每一个文件/文件夹的名称

注意: 两个抽象方法,都没有现成的实现类,需要自己实现该类,重写抽象方法。

3.2 过滤器原理及实现

listFiles()做了这么几件事:

  1. File类构造方法中传递的文件路径进行遍历,并对遍历后的结果进行封装(封装成File类)
  2. 调用参数传递的过滤器中的方法accept
  3. 把每一个封装的File都传递给accept

  • 如果accept对象,返回的是true,那么就会把这个File保存到这个File[]数组中。(反之不保存)

3.3 代码实现(匿名内部类)

使用匿名内部类实现File[] listFiles(FileFilter filter)
Java语言进阶 #文件&IO流 #Day19 #File类 #递归 #过滤器_第11张图片
使用匿名内部类实现File[] listFiles(FilenameFilter filter)Java语言进阶 #文件&IO流 #Day19 #File类 #递归 #过滤器_第12张图片

3.4 代码实现(Lambda表达式)

通过阅读源码,我们可以知道,这两个抽象类都只有一个抽象方法。(也就是说它们是函数接口Java语言进阶 #文件&IO流 #Day19 #File类 #递归 #过滤器_第13张图片Java语言进阶 #文件&IO流 #Day19 #File类 #递归 #过滤器_第14张图片

你可能感兴趣的:(java,File,递归,过滤器)