文件过滤器
文件过滤器介绍
文件过滤器介绍:
过滤,就是把不需要的东西去掉,保留需要的东西;
过滤器,就是能够实现过滤功能的工具;
文件过滤器,就是能够过滤文件的工具,可以根据指定规则滤掉不需要的文件和文件夹,留下需要的文件和文件夹;
在Java中,和文件过滤功能有关的主要有两个接口:FilenameFilter和FileFilter;
FileFilter:文件或文件夹对象过滤器。
FilenameFilter:文件名或文件夹的名称过滤器。
FileFilter接口
需求:使用过滤器获取一个文件夹里面的所有子文件夹;
FilenameFilter接口
需求:获取指定文件夹中的所有Java文件;
抽取通用过滤器,从文件夹中过滤需要后缀的文件:
/**
https://www.zhihu.com/video/1072878736957005824
递归
需求:输出指定文件夹及其子文件夹中的所有java文件;
思考:
1、根据题目要求,需要首先列举指定文件夹,得到里面所有的子文件夹和.java为后缀的子文件;
2、然后遍历第一步中得到的所有文件夹和文件,判断是文件还是文件夹;如果是文件,一定都是Java文件,可以直接输出;
如果是文件夹,就是子文件夹,需要拿子文件夹作为指定文件,通过过滤器列举里面所有子文件夹和以.java为后缀的子文件;
不断重复上面两个步骤
递归简介
递归,就是函数直接或间接的调用自身;
直接递归:自函数中直接调用自身;
public
间接递归:多个函数之间相互调用,形成闭环调用;如,A函数调用B函数,B函数调用C函数,……最后一个函数又调用A函数;
从前有座山,山上有座庙,庙里有个老和尚给小和尚讲故事:
从前有座山,山上有座庙,庙里有个老和尚给小和尚讲故事:
从前有座山,山上有座庙,庙里有个老和尚给小和尚讲故事:
递归简单应用
练习:求5的阶乘;
n的阶乘:n*(n-1)*(n-2)……*1;
递归的内存原理
递归的注意事项
- 使用递归,必须有一个终止条件
- 递归次数不能太多
有时即使设置了递归终止条件,但如果递归次数太多,仍然会出现栈内存溢出的问题:
总结:使用递归时必须注意两点:
- 递归要有结束条件;
- 递归的次数不能过多;
递归练习
需求:传说有一个农场,养了一对兔子,兔子从第三个月开始每个月都会生下一对小兔子;
每对小兔子长到第三个月,都会再生一对小兔子;
假设兔子都不会死;
问:第n个月,农场有多少对兔子?
这个问题实际上就是求斐波拉契数列第n项的值的问题;
- 1 2 3 5 8 13 21 34……
规律是:
- 第二项都是1,;从第三项开始,每一项都是前面两项的和;
f(n) = f(n-1) + f(n-2)
需求:删除指定文件夹;
思考:因为如果文件夹中有内容,不能直接删除,必须先删除文件夹里面的内容,然后才能删除这个变成空文件夹的文件夹;
步骤:
- 列举目标文件夹,获取文件夹中所有子文件和子文件夹;
- 遍历处理这些子文件和子文件夹:
- 如果是子文件,就直接删除;
- 如果是文件夹,就递归调用自身,将这个子文件夹作为新的目标文件夹处理
public
https://www.zhihu.com/video/1072879306694242304
今日小结:
IO介绍:
IO:input和output的缩写;input,表示将数据读进内存;output,表示将数据写出内存;
IO技术:用来实现程序内存和其它地方之间进行数据交换的技术;
数据持久化:将数据从内存中输出到持久化设备上(如硬盘、光盘等),使其能够长久的保存;
File类
在Java中,使用File类描述文件和文件夹;只要操作文件或者文件夹,都应该找File类;
File类只能操作文件,不能操作文件中的数据;要操作里面的数据,需要使用IO流;
一个File类的对象表示硬盘上的一个文件或文件夹对象(不一定真实存在);
File类的功能主要可分为
构造方法:
File(String pathname):根据一个路径得到File对象
File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
File(File parent, String child):根据一个父File对象和一个子文件/目录得到File对象
创建功能:
public boolean createNewFile():创建文件 如果存在这样的文件,就不创建了
public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了
public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来
获取方法:
public String getAbsolutePath(): 获取绝对路径
public String getPath(): 获取相对路径
public String getName(): 获取名称
public long lastModified(): 获取最后一次的修改时间,毫秒值
判断方法:
public boolean isDirectory(): 判断是否是目录
public boolean isFile(): 判断是否是文件
public boolean exists(): 判断是否存在
修改方法:
public boolean renameTo(File dest):重新命名此抽象路径名表示的文件
public boolean setLastModified(long time):设置此抽象路径名指定的文件或目录的最后一次修改时间。
删除方法:
public boolean delete():删除文件或者文件夹
列举方法:
public String[] list(): 获取指定目录下的所有文件或者文件夹的名称数组
public File[] listFiles(): 获取指定目录下的所有文件或者文件夹的File数组
public static File[] listRoots(): 获取系统中所有磁盘的根目录;
文件过滤器
用来在列举文件夹中的子文件和子文件夹时,根据指定规则过滤掉不需要的,保留符合规则的文件;
表示文件过滤器的接口有两个:
FilenameFilter:
过滤方法:如果儿子的对象能在父目录中存在,就返回true,否则false
boolean aceept(File dir, String name){
//dir:父目录
//name:儿子的名称
}
FileFilter:
过滤方法:如果参数表示的File对象能保留,就返回true,否则false
boolean aceept(File pathname){
// pathname : 要过滤的File对象
递归
一个函数直接或间接的调用自身,称为递归;
使用递归需要注意:
- 递归必须有一个终止条件,否则就是递归无法结束,会出现栈内存溢出;
- 递归的次数不能太多,否则递归一样栈内存溢出;