public class FileDemo5 {
public static void main(String[] args) {
fun1();
}
public static void fun1(){
File file = new File("E:\\Basics\\IO");
recursion(file,0);
}
public static void recursion(File file,int count){
if(file.exists() && file.isDirectory()){
File[] fileList = file.listFiles();
for(File f : fileList){
if(f.isDirectory()){
for(int i = 0 ; i < count ; i++){
System.out.print(" ");
}
System.out.println("文件夹名:" + f.getName());
recursion(f,count + 1);
} else{for(int i = 0 ; i < count ; i++){
System.out.print(" ");
}
System.out.println("文件名:" + f.getName());
}
}
} else{
System.out.println("该目录不存在!!!");
}
}
结果:
文件名:demo1.txt
文件名:demo2.txt
文件名:demo3.txt
文件夹名:dir1
文件夹名:dir11
文件夹名:dir111
文件名:dir111文本.txt
文件名:dir11.java
文件名:dir11文本.txt
文件名:dir12文本.txt
文件夹名:dir2
文件名:dir21.java
文件名:dir21文本.txt
可以在输出文件名之前进行判断:
else{
String fileName = f.getName();
if(fileName.endsWith(".java")){
for(int i = 0 ; i < count ; i++){
System.out.print(" ");
}
System.out.println("文件名:" + fileName);
}
}
结果:
文件夹名:dir1
文件夹名:dir11
文件夹名:dir111
文件名:dir11.java
文件夹名:dir2
文件名:dir21.java
文件夹名:newDir
文件夹名:newDir12
除了以上方法,我们可以使用 listFiles()方法的两个重载方法 listFiles(FileFileter filter)、listFiles(FilenameFilter filter)。使用到两种过滤器。
FileFilter过滤器
一个接口,没有实现类。需要我们自己写实现类,并实现accept()方法
使用 FileFilter 过滤器,是我们使用到 File 类的 listFiles(FileFilter fileFilter) 方法时。
FileFilter 实现类中 accept() 方法接收到,该目录下所有文件/文件夹,依次根据accept() 方法中定义的规则判断:符合,返回true; 不符合,返回false。而 dir.listFiles(FileFileter fileFilter)方法中接收到返回值:为true时,存入数组中,为false,不存入。
根据 上述需求,我们可以创建FileFilterImpl类:
FileFilter.java
package com.xiaojian.basics.io.file;
import java.io.File;
import java.io.FileFilter;
/**
* FileFilter 过滤器的实现类
*/
public class FileFilterImpl implements FileFilter {
@Override
public boolean accept(File pathname) {
if(pathname.isDirectory()){
return true;
}
return pathname.getName().endsWith(".java");
}
}
或使用匿名内部类:
File[] fileList = file.listFiles(new FileFilter(){
@Override
public boolean accept(File pathname) {
return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java");
}
});
使用 lambda 表达式(接口中只有一个抽象方法)
File[] fileList = file.listFiles((pathname) -> pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java"));
其中 FilenameFilter 接口的 accept(File dir,String name) 方法中的参数,dir:表示当前使用listFiles方法的File类;name:表示当前遍历的文件/目录。
使用匿名内部类
File[] fileList = file.listFiles(new FilenameFilter(){
@Override
public boolean accept(File dir, String name) {
return new File(dir,name).isDirectory() || name.toLowerCase().endsWith(".java");
}
});
使用 lambda表达式(接口中只有一个抽象方法)
File[] fileList = file.listFiles((dir,name) -> new File(dir,name).isDirectory() || name.toLowerCase().endsWith(".java"));