JAVA学习代码——实现文件名的过滤

时间:2021-08-14 13:14:04

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;
	}
}