File类和递归
File
该类是“文件”和“目录路径名”的抽象表示形式
- 继承于Object,实现了Serializable接口和Comparable接口,即支持序列化和比较大小
- File能直接被存储在有序的集合中
构造File的方法:
new File( File 文件路径 , String 文件名 )
new File( String 文件路径 , String 文件名)
new File( String 全路径 )
成员方法:
获取:
getAbsolutePath( ) 返回绝对路径名称
getName( ) 返回文件或目录的名称
getPath( ) 返回相对路径名称
创建、删除:
createNewFile( ) 创建一个新空文件
mkdir( ) 创建相对路径指定目录
delete( ) 删除相对路径文件或目录
判断:
exists( ) 判断文件或目录是否存在
isDirectory( ) 判断是否是目录
isFile( ) 判断是否是文件
获取路径下的目录和文件:
list( ) 返回 String[]
listFiles( ) 返回 File[]
注意:
- 根据需要不同的方法来选择不同的返回对象
- 指定的必须是目录,否则会空指针异常
文件过滤器
在File类中,有重载listFiles方法
File[] listFiles(FilenameFilter filter);
返回在指定目录中,满足指定过滤器的文件和目录
使用方法
方法一:定义类,实现文件名称过滤器(FilenameFilter)
class MyFileFilter implements FilenameFilter{
public boolean accept(File dir, String name) {
return name.endsWith(".java");
}
}
方法二:定义类,实现文件过滤器(FileFilter)
class FileFileterByDir implements FileFilter{
public boolean accept(File pathname) {
return pathname.isDirectory();
}
}
//主函数,匿名调用自定义过滤器
public class FileDemo2 {
public static void main(String[] args) {
File file = new File("E:\\test");
//获取指定扩展名的文件,由于要对所有文件进行扩展名筛选,因此调用方法需要传递过滤器
File[] files = file.listFiles(new MyFileFilter());
for (File f : files) {
System.out.println(f);
}
}
}
方法三:匿名内部类形式使用
String[] files = f.list(new FilenameFilter() {
//使用匿名内部类的方法
@Override
public boolean accept(File dir, String name) {
//通过匿名内部类的返回值来控制指定目录下面的文件和文件夹的显示,只显示.java文件
return name.endsWith(".java");
}
});
对于 accept() 方法接受的两个参数
当需要过滤 文件名称 时就可以用 FilenameFilter 过滤器
当需要过滤 文件 或 文件夹 时就可以用 FileFilter 过滤器,比如需要目录下所有文件夹
递归
递归调用可以分为两种:
- 直接递归 —— A方法内直接调用A
- 间接递归 —— A方法调用B方法,B方法调用A方法
注意
- 要有出口,否则不停创建栈帧会导致栈溢出
- 递归次数不能太多,否则超过最大限度也会栈溢出
- 递归的过程是不停压栈后再不停弹栈的过程,主要难点是思想