0、
在上一小节 File 类中的常用方法表中有一个 list()方法,该方法用于遍历某个指定目录下的所有文件的名称,接下接下来通过一个案例来演示 list()方法的用法,如下所示。
import java.io.File;
public class example12 {
public static void main(String[] args) throws Exception{
//创建 File 对象
File file = new File("C:\\Users\\yuchuang\\eclipse-workspace\\chapter 07");
if (file.isDirectory()) { //判断 File 对象对应的目录是否存在
String[] names = file.list(); //获得目录下的所有文件的文件名
for (String name : names) {
System.out.println(name); //输出文件名
}
}
}
}
运行结果如下所示。
上述代码块中,创建了一个 File 对象,并指定了一个路径,通过调用 File 的 isDirectory()方法判断路径指向的是否为存在的目录,如果存在就调用 list()方法,获得一个 String 类型的数组 names,数组中包含这个目录下所有文件的文件名。接着通过循环遍历出每个文件的文件名,依次打印出每个文件的文件名。
它实现了遍历一个目录下所有文件的功能,然而有时程序员只是需要得到指定类型的文件,如获取指定目录下所有指定类型的文件,如获取指定目录下所有的“.java”文件。针对这种需求,File 类中提供了一个重载的 list(FilenameFilter filter)方法,该方法接收一个 filenameFilter,并在 accept()方法中做出判断,从而获得指定类型的文件。FilenameFiter 是一个接口,被称作文件过滤器,当中定义了一个抽象方法 accept(File dir, String name)。在调用 list()方法时,需要实现文件过滤器 FilenameFilter,并在 accept()方法中做出判断,从而获得指定类型的文件。
1、
接下来分步骤分析 list(FilenameFilter fiter)方法的工作原理。
- 调用 list()方法传入 FilenameFiter 文件过滤器对象
- 取出当前 File 对象所代表目录下所有子目录和文件
- 对于每一个子目录或文件,都会调用文件过滤器对象的 accept(Flie dir, String name)方法,**并把代表当前目录的 File 对象以及这个子目录或文件的名字作为 dir 和 name 传递给方法**
- 如果 accept()方法返回 true,就将当前遍历的这个子目录或文件添加到数组中,如果返回 false,则不添加
接下来通过一个案例来演示如何遍历指定目录下所有扩展名为“.txt”的文件,如下所示。
import java.io.File;
import java.io.FilenameFilter;
public class example13 {
public static void main(String[] args) {
//创建 File 对象
File file = new File("C:\\Users\\yuchuang\\eclipse-workspace\\chapter 07");
//创建过滤器对象
FilenameFilter filter = new FilenameFilter() {
//重写 accept()方法
@Override
public boolean accept(File dir, String name) {
//dir 文件的父路径
//name 文件的名称
File currFile = new File(dir, name); //调用构造方法 File(file parent, String child)
//如果文件名以 .txt 结尾返回 true,否则返回 false
if (currFile.isFile() && name.endsWith(".txt")) {
return true;
}else {
return false;
}
}
};
if (file.exists()) { //判断 File 对象对应的目录是否存在
String[] lists = file.list(filter); //获得过滤后的所有文件名数组
for (String name : lists) {
System.out.println(name);
}
}
}
}
运行结果如下所示。
在上述代码块中定义了 FilenameFilter 文件过滤器对象 filter,并且实现了 accept()方法。在 accept()方法中,对当前正在遍历的 currFile 对象进行了判断,只有当 currFile 对象代表文件,并且扩展名为“.txt”时,才返回 true。在调用 File 对象的 list()方法时,将 filter 对象传入,就得到了包含所有“.txt”文件名字的字符串数组。
2、
前两个例子演示的都是遍历目录下文件的文件名,有时候在一个目录下,除了文件,还有子目录,如果想得到所有子目录下的 File 类型对象,list()方法显然不能满足需求,这时需要使用 File 类提供的另一个方法 listFiles()。listFiles()方法返回一个包含了 File 对象**所有子文件和子目录**的 File 数组,当对数组中的元素进行遍历时,如果元素中还有子目录需要遍历,则需要使用递归。接下来通过一个案例来实现遍历指定目录下的文件,如下所示。
import java.io.File;
public class example14 {
public static void main(String[] args) {
//创建一个代表目录的 File 对象
File file = new File("C:\\Users\\yuchuang\\eclipse-workspace\\chapter 07");
//调用 fileDir()方法
fileDir(file);
}
public static void fileDir(File dir) {
//获得表示目录下所有文件的数组
File[] files = dir.listFiles();
for (File file : files) { //遍历所有的子目录和文件
if (file.isDirectory()) {
fileDir(file); //如果是目录,递归调用 dileDir()
}
System.out.println(file.getAbsolutePath()); //输出打印文件的绝对路径
}
}
}
运行结果如下所示。
上述代码块中定义了一个静态方法 fileDir(),该方法接收一个表示目录的 File 对象。在方法中,首先通过调用 listFiles()方法把该目录下所有的子目录和文件存放到一个 File 类型的数组 files 中,接着遍历数组 files,并对当前遍历的 File 对象进行判断。如果是目录就重新调用 fileDir()方法进行递归,如果是文件就直接打印输出文件的路径,这样该目录下的所有的文件就被成功遍历出来了。