二、列出指定目录下的文件(包括子目录)
当File对象指向一个目录时,可以通过File对象来获取目录下的文件信息。
1、File类的list方法返回该目录下所有文件(包括目录)的文件名,文件名不包含路径信息。
2、File类的listFile方法返回该目录下所有文件(包括目录)的File对象
3、FilenameFilter是文件名过滤器接口类,所有自定义的文件名过滤器必须实现改接口的accept方法
实例演示
package
book.io;
import java.io.File;
import java.io.FilenameFilter;
public class ListFileUtil ... {
/** *//** 这是一个内部类,实现了FilenameFilter接口,用于过滤文件 */
static class MyFilenameFilter implements FilenameFilter ...{
private String surfix = ""; //文件名后缀
public MyFilenameFilter(String surfix) ...{
this.surfix = surfix;
}
public boolean accept(File dir, String name) ...{
//如果文件名与surfix指定的后缀相同,便返回true,否则返回false
if(new File(dir, name).isFile()) ...{
return name.endsWith(surfix);
} else ...{
//如果是文件夹,则直接返回true
return true;
}
}
}
/** *//**
* 列出目录下所有文件包括子目录的文件路径
* @param dirName 文件夹的文件路径
*/
public static void listAllFiles(String dirName) ...{
//如果dir不以文件分隔符结尾,自动添加文件分隔符
if (!dirName.endsWith(File.separator)) ...{
dirName = dirName + File.separator;
}
File dirFile = new File(dirName);
//如果dir对应的文件不存在,或者不是一个文件夹,则退出
if (!dirFile.exists() || (!dirFile.isDirectory())) ...{
System.out.println("List失败!找不到目录:" + dirName);
return;
}
//列出源文件夹下所有文件(包括子目录)
File[] files = dirFile.listFiles();
for (int i = 0; i < files.length; i++) ...{
if (files[i].isFile()) ...{
System.out.println(files[i].getAbsolutePath() + " 是文件!");
} else if (files[i].isDirectory()) ...{
System.out.println(files[i].getAbsolutePath() + " 是目录!");
ListFileUtil.listAllFiles(files[i].getAbsolutePath());
}
}
}
/** *//**
* 列出目录中通过文件名过滤器过滤后的文件
* @param filter 文件名过滤器对象
* @param dirName 目录名
*/
public static void listFilesByFilenameFilter(FilenameFilter filter, String dirName) ...{
//如果dir不以文件分隔符结尾,自动添加文件分隔符
if (!dirName.endsWith(File.separator)) ...{
dirName = dirName + File.separator;
}
File dirFile = new File(dirName);
//如果dir对应的文件不存在,或者不是一个文件夹,则退出
if (!dirFile.exists() || (!dirFile.isDirectory())) ...{
System.out.println("List失败!找不到目录:" + dirName);
return;
}
//列出源文件夹下所有能通过过滤器的文件(包括子目录)
File[] files = dirFile.listFiles(filter);
for (int i = 0; i < files.length; i++) ...{
if (files[i].isFile()) ...{
System.out.println(files[i].getAbsolutePath() + "是文件!");
} else if (files[i].isDirectory()) ...{
System.out.println(files[i].getAbsolutePath() + "是目录!");
ListFileUtil.listFilesByFilenameFilter(filter, files[i].getAbsolutePath());
}
}
}
public static void main(String[] args) ...{
String dir = "D:/work/JavaExample";
System.out.println(dir + " 目录下的内容:");
ListFileUtil.listAllFiles(dir);
System.out.println();
System.out.println("经过过滤器过滤后的内容");
//新建一个过滤器,参数为".java"
FilenameFilter myFilenameFilter = new ListFileUtil.MyFilenameFilter(".java");
ListFileUtil.listFilesByFilenameFilter(myFilenameFilter, dir);
}
}
import java.io.File;
import java.io.FilenameFilter;
public class ListFileUtil ... {
/** *//** 这是一个内部类,实现了FilenameFilter接口,用于过滤文件 */
static class MyFilenameFilter implements FilenameFilter ...{
private String surfix = ""; //文件名后缀
public MyFilenameFilter(String surfix) ...{
this.surfix = surfix;
}
public boolean accept(File dir, String name) ...{
//如果文件名与surfix指定的后缀相同,便返回true,否则返回false
if(new File(dir, name).isFile()) ...{
return name.endsWith(surfix);
} else ...{
//如果是文件夹,则直接返回true
return true;
}
}
}
/** *//**
* 列出目录下所有文件包括子目录的文件路径
* @param dirName 文件夹的文件路径
*/
public static void listAllFiles(String dirName) ...{
//如果dir不以文件分隔符结尾,自动添加文件分隔符
if (!dirName.endsWith(File.separator)) ...{
dirName = dirName + File.separator;
}
File dirFile = new File(dirName);
//如果dir对应的文件不存在,或者不是一个文件夹,则退出
if (!dirFile.exists() || (!dirFile.isDirectory())) ...{
System.out.println("List失败!找不到目录:" + dirName);
return;
}
//列出源文件夹下所有文件(包括子目录)
File[] files = dirFile.listFiles();
for (int i = 0; i < files.length; i++) ...{
if (files[i].isFile()) ...{
System.out.println(files[i].getAbsolutePath() + " 是文件!");
} else if (files[i].isDirectory()) ...{
System.out.println(files[i].getAbsolutePath() + " 是目录!");
ListFileUtil.listAllFiles(files[i].getAbsolutePath());
}
}
}
/** *//**
* 列出目录中通过文件名过滤器过滤后的文件
* @param filter 文件名过滤器对象
* @param dirName 目录名
*/
public static void listFilesByFilenameFilter(FilenameFilter filter, String dirName) ...{
//如果dir不以文件分隔符结尾,自动添加文件分隔符
if (!dirName.endsWith(File.separator)) ...{
dirName = dirName + File.separator;
}
File dirFile = new File(dirName);
//如果dir对应的文件不存在,或者不是一个文件夹,则退出
if (!dirFile.exists() || (!dirFile.isDirectory())) ...{
System.out.println("List失败!找不到目录:" + dirName);
return;
}
//列出源文件夹下所有能通过过滤器的文件(包括子目录)
File[] files = dirFile.listFiles(filter);
for (int i = 0; i < files.length; i++) ...{
if (files[i].isFile()) ...{
System.out.println(files[i].getAbsolutePath() + "是文件!");
} else if (files[i].isDirectory()) ...{
System.out.println(files[i].getAbsolutePath() + "是目录!");
ListFileUtil.listFilesByFilenameFilter(filter, files[i].getAbsolutePath());
}
}
}
public static void main(String[] args) ...{
String dir = "D:/work/JavaExample";
System.out.println(dir + " 目录下的内容:");
ListFileUtil.listAllFiles(dir);
System.out.println();
System.out.println("经过过滤器过滤后的内容");
//新建一个过滤器,参数为".java"
FilenameFilter myFilenameFilter = new ListFileUtil.MyFilenameFilter(".java");
ListFileUtil.listFilesByFilenameFilter(myFilenameFilter, dir);
}
}
源码分析:
MyFilenameFilter类是一个自定义的文件名过滤器,实现了FilenameFilter接口。属性surfix表示文件过滤器支持的文件名后缀,在accept方法中,如果文件名的后缀为surfix,则返回true,表示文件能通过过滤器。如果是目录则直接通过。
listFilesByFilenameFilter方法列出目录下满足文件名过滤器的所有文件的绝对路径。在使用File的listFile方法时指定文件名过滤器对象,它只返回能通过文件名过滤器的File对象。