File 类有一个欺骗性的名字—— 通常会认为它对付的是一个文件,但实情并非如此。它既代表一个特定文件
的名字,也代表目录内一系列文件的名字。若代表一个文件集,便可用list()方法查询这个集,返回的是一
个字串数组。之所以要返回一个数组,而非某个灵活的集合类,是因为元素的数量是固定的。而且若想得到
一个不同的目录列表,只需创建一个不同的 File 对象即可。事实上,“ FilePath”(文件路径)似乎是一个
更好的名字。本节将向大家完整地例示如何使用这个类,其中包括相关的 FilenameFilter(文件名过滤器)
接口。
package foo; import java.io.File; import java.io.FilenameFilter; /** * DirFilter 类:实现对目录下的过滤,s为过滤字符串 或者创建匿名内部类来实现过滤 或者将匿名内部类定义成 list()的一个参数,使其显得更加精简 */ public class DirList { // 创建静态方法 // 注意 filter()的自变量必须是 final。这一点是匿名内部类要求的,使其能使用来自本身作用域以外一个对象。 // public static FilenameFilter filter(final String afn) { // // 创建匿名内部类 // return new FilenameFilter() { // String fn = afn; // // public boolean accept(File dir, String n) { // String f = new File(n).getName(); // return f.indexOf(fn) != -1; // } // }; // 内部类结束 // } public static void main(String[] args) { try { String s = "src";// 过滤字符串,有的输出 File path = new File(".");// 文件路径(当前路径) String[] list;// 数组list用来存储目录名称 // 若File代表一个文件集,便可用list()方法查询这个集,返回的是一个字串数组。 // 之所以要返回一个数组,而非某个灵活的集合类,是因为元素的数量是固定的 list自动调用 list = path.list(new DirFilter(s));// 调用查询方法 // 将匿名内部类作为list()的参数 // list = path.list( // new FilenameFilter() { // public boolean // accept(File dir, String n) { // String f = new File(n).getName(); // return f.indexOf(args[0]) != -1; // } // }); // 输出list数组 for (int i = 0; i < list.length; i++) { System.out.println("<><>" + list[i]); } } catch (Exception e) { e.printStackTrace(); } } } /* * DirFilter 类“实现”了 interface FilenameFilter,它指出这种类型的所有对象都提供了一个名为 accept()的方法 把 * accept()方法提供给 list()方法,使 list()能够“回调” accept() ,从而判断应将哪些文件名包括到列表中。 由于 * list()采用一个 FilenameFilter 对象作为自己的自变量使用,所以我们能传递实现了 FilenameFilter 的任何 * 类的一个对象,用它决定(甚至在运行期) list()方法的行为方式。回调的目的是在代码的行为上提供更大的灵活性。accept()方 法必须接纳一个 * File 对象,用它指示用于寻找一个特定文件的目录;并接纳一个 String,其中包含了要寻找之文件的名字。可决定 * 使用或忽略这两个参数之一,但有时至少要使用文件名。记住list()方法准备为目录对象中的每个文件名调用 accept(),核实哪个 应包含在内—— 具体由 * accept()返回的“布尔”结果决定。 */ class DirFilter implements FilenameFilter { String afn; // 传入过滤字符串 DirFilter(String afn) { this.afn = afn; } public boolean accept(File dir, String name) { // dir为path的路径即".",name为当前查询到的文件名称 // System.out.println("dir" + dir + "name" + name); // 过滤文件信息: // 为确定我们操作的只是文件名,其中没有包含路径信息,必须采用String 对象,并在它的外部创建一个 // File 对象。然后调用 getName(),它的作用是去除所有路径信息 String f = new File(name).getName();// f为查询到的名称 // 若名称包含afn,返回true,否则返回false return f.indexOf(afn) != -1; } }