【转】File类应用 - FilenameFilter 和 FileFilter

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 接口:

package com.lp.ecjtu.File.filter;

import java.io.File;
import java.io.FilenameFilter;

public class FileterByJava implements FilenameFilter {

    private String SufixName;//传入过滤的名称
    public FileterByJava(String SufixName){
        this.SufixName = SufixName;
    }

    @Override
    public boolean accept(File dir, String name) {
        //System.out.println("dir"+dir+"_____"+"name"+name);//返回dir:E:\workspace\IOTest_____name:buf.txt
    }

}
package com.lp.ecjtu.File.filter;

import java.io.File;
import java.io.FilenameFilter;

public class FileListFilter {

    public static void main(String[] args){
        ListFileFileterByjava();
    }

    /**
     *
     * 使用实现FilenameFilter接口的方法,
     * 过滤String[] list(FilenameFilter filter)
     * 文件名过滤
     */
     public static void ListFileFileterByjava(){
         File f = new File("E:"+File.separator+"workspace"+File.separator+"IOTest");
         String[] fileNames = f.list(new FileterByJava(".java"));//使用具体对象,把过滤后的以.java文件的文件放到数组当中
         System.out.println(fileNames.length);//含有.java文件数组的长度
         for(String name:fileNames){//遍历找到的.java文件
             System.out.println(name);
         }

     }

    /**
     * 列出指定目录下,后缀为.java的文件,使用方法String[] list(FilenameFilter filter)使用匿名内部类的方法
     */
    public static void ListFileNameFileter(){
        File f = new File("E:"+File.separator+"workspace"+File.separator+"IOTest");
        String[] files = f.list(new FilenameFilter() {//使用匿名内部类的方法

            @Override
            public boolean accept(File dir, String name) {
                // TODO Auto-generated method stub
                //System.out.println("dir:"+dir+"name....."+name);//测试说明dir表示指定目录,name表示指定目录的名称
                return name.endsWith(".java");//通过匿名内部类的返回值来控制指定目录下面的文件和文件夹的显示,只显示.java文件
            }
        });
        System.out.println(files.length);
        //遍历指定目录下面的文件和目录
        for(String file:files){
            System.out.println(file);
        }
    }
}

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

代码:

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

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

代码:

package com.lp.ecjtu.File.filter;

import java.io.File;
import java.io.FileFilter;

public class FileFilterDemo {

    public static void main(String[] args){
        File dir = new File("E:\\复件 demodir");
        ListFileFileter(dir);
    }
    /**
     *  现在要求输入一个文件的目录,之后将里面所有的备份文件删除,备份文件都是以“.bak”或".BAK"结尾,过滤文件类型为.bak文件
     */
    public static void ListFileFileter(File dir){
        if(dir.exists()){
            //匿名内部类,把FileFilter接口对象作为参数
            File[] files = dir.listFiles(new FileFilter() {
                @Override
                public boolean accept(File pathname) {
                    if(pathname.isDirectory()){
                        return true;
                    }
                    String name = pathname.getName();//获取文件的名称E:\复件 demodir\Learn\sgim_piccell.v1.bin.bak
                    System.out.println("****************"+pathname);
                    return name.endsWith(".bak")|| name.endsWith(".BAK");//过滤文件类型为.bak或者.BAK文件,而不包含.BAK或者.bak的文件
                }
            });
           //深度遍历文件,递归
            for(int i=0;i<files.length;i++){
                if(files[i].isFile()){//如果遍历到的是文件,直接删除
                    files[i].delete();
                }else{//还是目录,继续遍历,直到是文件,再删除
                    ListFileFileter(files[i]);
                }
            }
        }else{
            throw new RuntimeException("操作的文件或者目录不存在!");
        }
    }
}

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

package com.lp.ecjtu.File.filter;

import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
/**
 *
 * 需求:输入一个文件目录,之后将里面所有备份的文件删除,备份文件都是以".bak" 和".BAK"结尾
 *
 */
public class FileterByFile implements FileFilter {

    @Override
    public boolean accept(File pathname) {
        if(pathname.isDirectory()){
            return true;
        }
        String name = pathname.getName();
        // TODO Auto-generated method stub
        System.out.println("****************"+pathname);
        return name.endsWith(".bak")|| name.endsWith(".BAK");
    }

}
package com.lp.ecjtu.File.filter;

import java.io.File;
import java.io.FileFilter;

public class FileFilterDemo {

    public static void main(String[] args){
        File dir = new File("E:\\复件 demodir");
        ListFileFileterBak(dir);
    }
    /**     * 删除满足条件的文件     * @param dir     */
    public static void ListFileFileterBak(File dir){
        if(dir.exists()){
            File[] files = dir.listFiles(new FileterByFile());//使用过滤
            for(File file:files){
                if(file.isDirectory()){
                    ListFileFileterBak(file);
                }else{
                    file.delete();
                }
            }
        }else{
            throw new RuntimeException("操作的文件或者目录不存在!");
        }
    }
}
时间: 2024-08-07 01:18:43

【转】File类应用 - FilenameFilter 和 FileFilter的相关文章

java基础知识回顾之javaIO类--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) 或者boo

异常及File类概述

一.异常 1.异常分类: Throwable:Throwable类是 Java 语言中所有错误或异常的超类.它只有两个子类 Error:属于严重问题,只能避免:如内存溢出(OutOfMemory) Exception:可以解决的异常问题 编译时期异常:在写代码期间遇到的异常,不处理没办法运行: 运行时期异常(RuntimeException):在程序运行时期遇到的异常,一般情况不是编译时期异常就是运行时期异常: 2.异常处理: 1)捕获异常:try-catch-finally A:格式:try{

java File类

今天我要总结一下java File类.这个是一个很重要的类. 首先是我画的思维导图. 还写了一些自己写的代码. /** * Date : 2017/6/24 * Author : Hsj * Description : */ public class Demo { /** * File(pathname)表示文件或文件夹路径 * File(String parent,child); * File(File parent,child); */ @Test public void fun() { /

java019异常、File类

异常的分类: * Error:称为错误类.表示java运行时系统内部错误或者资源耗尽的错误,仅靠修改程序本身不能恢复执行的.比如:服务器宕机,数据库崩溃等 * Exception:称为异常类,表示程序本身可以处理的错误. 继承体系 * Throwable  * Error   * Exception   * RuntimeException //除了运行时异常都是编译时异常,一般都是程序员本身的错误 JVM默认处理异常的方式: * a:自己将该问题处理,然后继续运行,对应下方的 a 代码 * b

黑马程序员——【Java基础】——File类、Properties集合、IO包中的其他类

---------- android培训.java培训.期待与您交流! ---------- 一.File类 (一)概述 1.File类:文件和目录路径名的抽象表现形式 2.作用: (1)用来将文件或文件夹封装成对象 (2)方便于对“文件”与“文件夹属性信息”进行操作 (3)File对象,可以作为参数传递给流的构造函数 (二)构造方法 * 通过File的构造函数创建File对象 方式1:File f = new File("c:\\a.txt"); 方式2:File f2 = newF

文件操作(File类等)API摘要

Console 此类包含多个方法,可访问与当前 Java 虚拟机关联的基于字符的控制台设备(如果有). 虚拟机是否具有控制台取决于底层平台,还取决于调用虚拟机的方式.如果虚拟机从一个交互式命令行开始启动,且没有重定向标准输入和输出流,那么其控制台将存在,并且通常连接到键盘并从虚拟机启动的地方显示.如果虚拟机是自动启动的(例如,由后台作业调度程序启动),那么它通常没有控制台. 如果此虚拟机具有控制台,那么它将由此类唯一的实例(可通过调用 System.console() 方法获得)表示.如果没有可

黑马程序员-File类

File类: 将文件或文件夹封装成对象. 方便对文件与文件夹的属性进行操作. File对象可以作为参数传递给流的构造函数. 流不能操作的文件夹,不能操作文件的属性信息,流只能操作数据.        字段摘要:static String separator 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串.   构造函数: File(File parent, String child) :将目录名和文件名分开.可以使文件名变成变量. 作为变量参数使用. 例:File f1 = new

详谈JAVA中的file类与IO流

File类 位置于java.io包构造方法:File(String parent, String child)new file("d:\\","a.txt") File(String pathname) new file("d:\\a.txt") File(File parent, String child)File f = new File("d:\\");File f1=new File(f,"a.txt&quo

JavaIO学习之File类

 File类 作用: 1.用来将文件或者文件夹封装成对象. 2.方便对文件与文件夹的属性进行操作. 3.File对象可以作为参数传递给流的构造函数. IO流的流对象只能操作设备上的数据. 文件属性的操作和文件夹的创建,删除由File类完成. File类 字段摘要 static String pathSeparator 与系统有关的路径分隔符,为了方便,它被表示为一个字符串. static char pathSeparatorChar 与系统有关的路径分隔符. static String se