public File[] listFiles()
:返回一个File数组 表示该File目录中的所有的子文件或目录
listFiles()方法可传入两种参数实现文件的过滤
listFiles(FileFilter filter)
和listFiles(FilenameFilter filter)
1、FileFilter文件过滤器
java.io.FileFilter
接口:用于抽象路径名(File对象)的过滤器
作用:用于过滤File文件
接口里唯一的抽象方法:boolean accept(File pathname)
:测试pathname是否应该包含在当前File目录中 若符合则返回true
参数:使用ListFiles方法遍历目录后 得到的每一个文件对象
注:这两个过滤器接口没有实现类
须自己写实现类 然后重写过滤的方法(accept()) 在方法中自己定义过滤的规则
- 1、listFiles()方法会对构造方法中传递的目录进行遍历
并获取目录中的每一个文件或文件夹 然后封装成File对象 - 2、listFiles()方法会调用传递进来的过滤器中的accept()方法
- 3、listFiles()方法会将遍历得到的每一个File对象传递给accept()方法的pathname参数
accept()方法返回的是一个布尔值:
- true:将传递过去的File对象保存到File数组中(放行)
- false:不将传递过去的File对象保存到File数组中
案例:遍历指定路径下所有.java结尾的文件
FileFilter过滤器类:
public class FileFilterImpl implements FileFilter
{
@Override
public boolean accept(File pathname) {
if (pathname.getName().toLowerCase().endsWith(".java"))
{
return true;
}
// 若pathname是文件夹 则返回true 继续遍历这个文件夹
return pathname.isDirectory();
}
}
主类:
public static void main(String[] args) {
// 给出路径
File file=new File("F:\\IdeaProjects\\filetest");
getAllFile(file);
}
// 定义一个方法 参数传递File类型的目录 方法中对目录进行遍历
private static void getAllFile(File dir)
{
File[] files = dir.listFiles(new FileFilterImpl());// 传递过滤器对象
for (File f:files)
{
if (f.isDirectory())
{
// 递归调用
getAllFile(f);
}
else
{
System.out.println(f);
}
}
}
匿名内部类方式简化:
public static void main(String[] args) {
// 给出路径
File file=new File("F:\\IdeaProjects\\filetest");
getAllFile(file);
}
// 定义一个方法 参数传递File类型的目录 方法中对目录进行遍历
private static void getAllFile(File dir)
{
File[] files = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
// 过滤规则
return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java");
}
});// 匿名内部类的方式传递过滤器对象
for (File f:files)
{
if (f.isDirectory())
{
// 递归调用
getAllFile(f);
}
else
{
System.out.println(f);
}
}
}
Lambda表达式简化:
public static void main(String[] args) {
// 给出路径
File file=new File("F:\\IdeaProjects\\filetest");
getAllFile(file);
}
// 定义一个方法 参数传递File类型的目录 方法中对目录进行遍历
private static void getAllFile(File dir)
{
File[] files = dir.listFiles((File pathname) -> pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java"));
for (File f:files)
{
if (f.isDirectory())
{
// 递归调用
getAllFile(f);
}
else
{
System.out.println(f);
}
}
}
2、FilenameFilter文件名过滤器
java.io.FilenameFilter
接口:实现此接口的类实例可用于过滤器文件名
作用:用于过滤文件名称
接口里唯一的抽象方法:boolean accept(File dir,String name)
测试指定文件是否应该包含在某一文件列表中
参数:
- File dir:构造方法中传递的被遍历的目录(注意 是File类型的)
- String name:使用ListFiles方法遍历目录从而得到的每一个文件或文件夹的名称
accept()方法返回的是一个布尔值:
- true:将传递过去的File对象保存到File数组中(放行)
- false:不将传递过去的File对象保存到File数组中
还是那个案例:遍历指定路径下所有.java结尾的文件
匿名内部类形式:
public static void main(String[] args) {
// 给出路径
File file=new File("F:\\IdeaProjects\\filetest");
getAllFile(file);
}
// 定义一个方法 参数传递File类型的目录 方法中对目录进行遍历
private static void getAllFile(File dir)
{
File[] files=dir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
// 目录名dir须和文件名name组合成为一个文件对象进行判断
return new File(dir,name).isDirectory() || name.toLowerCase().endsWith(".java");
}
});
for (File f:files)
{
if (f.isDirectory())
{
// 递归调用
getAllFile(f);
}
else
{
System.out.println(f);
}
}
}
使用Lambda表达式简化:
public static void main(String[] args) {
// 给出路径
File file=new File("F:\\IdeaProjects\\filetest");
getAllFile(file);
}
// 定义一个方法 参数传递File类型的目录 方法中对目录进行遍历
private static void getAllFile(File dir)
{
// 使用Lambda表达式再次简化匿名内部类
// 使用前提:接口中只有一个抽象方法
// File[] files=dir.listFiles((File d,String name) -> {
// return new File(d,name).isDirectory() || name.toLowerCase().endsWith(".java");
// });
// 再次简化Lambda表达式
File[] files=dir.listFiles((d,name) -> new File(d,name).isDirectory() || name.toLowerCase().endsWith(".java"));
for (File f:files)
{
if (f.isDirectory())
{
// 递归调用
getAllFile(f);
}
else
{
System.out.println(f);
}
}
}