【转】File类应用

FilenameFilter & FileFilter

FilenameFilter 和 FileFilter 都是用来过滤文件,例如过滤,以.jpg或者.java结尾的文件,通过看他们的源码:通过使用File类中String[] list(FilenameFilter filter)或者public File[] listFiles(FileFilter filter)方法,把FilenameFilter或者FileFilter接口对象作为参数传入,通过实现接口里面的 boolean accept(File dir, String name) 或者boolean accept(File pathname)方法来过滤出满足条件的文件。区别:FilenameFilter的性能比FileFilter的好.

public File[] listFiles(FileFilter filter) 

返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。除了返回数组中的路径名必须满足过滤器外,此方法的行为与 listFiles() 方法相同。如果给定 filter 为 null,则接受所有路径名。否则,当且仅当在路径名上调用过滤器的 FileFilter.accept(java.io.File) 方法返回 true 时,该路径名才满足过滤器。

/**

    File类: 

* 使用 String[] list(FilenameFilter filter)遍历指定目录下面,指定的后缀的文件。

    底层怎么实现过滤的?

String[] list(FilenameFilter filter)
    原理:先把目录下面的文件调用list()方法全部存放到一个String[]数组里面,然后遍历数组,
    把符合filter.accept(this, names[i])条件的放到一个ArrayList里面,然后把
    List转化为String[]数组
    底层源码解析:
     public String[] list(FilenameFilter filter) {
        String names[] = list();//把所有目录文件列出来
        if ((names == null) || (filter == null)) {//如果没有目录或者文件,返回null
            return names;
        }
        ArrayList v = new ArrayList();
        for (int i = 0 ; i < names.length ; i++) {//找到文件,遍历
            if (filter.accept(this, names[i])) {
            v.add(names[i]);/把满足条件的放到List集合中
            }
        }
        return (String[])(v.toArray(new String[v.size()]));
    }

* FilenameFilter 接口
 * 接口方法:
 * boolean accept(File dir,String name) 可以使用此方法列出指定目录下面的带有某些后缀的文件。 
    参数:
    dir - 被找到的文件所在的目录。
    name - 文件的名称。 
    返回:
    当且仅当该名称应该包含在文件列表中时返回 true;否则返回 false。
 *
 */

代码:

1.需求找出某个路径下面以.java结尾的文件。

实现:FilenameFilter 接口:

/ * FileFilter接口
 * 接口方法:
 * boolean accept(File dir) 可以使用此方法列出指定目录下面的带有某些后缀的文件。 
    参数:
    dir - 被找到的文件所在的目录。
    返回:
    当且仅当该名称应该包含在文件列表中时返回 true;否则返回 false。
 */

代码:

需求:现在要求输入一个文件的目录,之后将里面所有的备份文件删除,备份文件都是以“.bak”或".BAK"结尾,也就是说过滤文件类型为.bak或者.BAK文件后进行删除.

    第一种方法,使用FileFilter内部类的方法,进行操作:

代码:

第二中方法实现接口,使用真实类的对象: