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的好.

/**

    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,String name) 可以使用此方法列出指定目录下面的带有某些后缀的文件。
    参数:
    dir - 被找到的文件所在的目录。
    name - 文件的名称。
    返回:
    当且仅当该名称应该包含在文件列表中时返回 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("操作的文件或者目录不存在!");
}
}
}


 

java基础知识回顾之javaIO类--File类应用:过滤器接口FilenameFilter和FileFilter的更多相关文章

  1. java基础知识回顾之javaIO类--File类

    File类是对文件系统中文件以及目录(文件夹)进行封装的对象,可以通过面向对象的思想来操作文件和目录(文件夹).File类保存文件或目录的各种元素的信息,包括文件名,文件长度,最后修改日期,是否可读, ...

  2. java基础知识回顾之javaIO类--File类应用:获取指定目录下面的指定扩展名的文件,将文件的绝对路径写入到目的文件当中

    /** * File文件综合应用 * 需求:获取指定目录下面,指定扩展名的文件,将文件的绝对路径写到文本文件当中. *  * 思路:1.需要深度遍历.--递归 * 2.遍历的过程中过滤指定扩展名的文件 ...

  3. java基础知识回顾之javaIO类--File类应用:递归深度遍历文件

    代码如下: package com.lp.ecjtu.File.FileDeepList; import java.io.File; public class FileDeepList { /** * ...

  4. java基础知识回顾之javaIO类--File类应用:删除带内容的目录

    /** * 深度删除一个带内容的目录 * 原理:必须从里往外删除,需要深度遍历 * @author Administrator * */ public class FileDeleteList { / ...

  5. java基础知识回顾之javaIO类---FileWriter和FileReader

    FileWriter类的构造方法定义如下: 1.public FileWriter(File file)throws IOException 字符流的操作比字节流操作好在一点,就是可以直接输出字符串了 ...

  6. java基础知识回顾之javaIO类--RandomAccessFile类

    java.io 类 RandomAccessFile java.lang.Object java.io.RandomAccessFile1.该类不是IO流中的子类.2.该类既能读又能写.3.该对象内部 ...

  7. java基础知识回顾之javaIO类--java序列化和反序列化

    /** *  * 一:理解序列化反序列化及其应用 * 序列化:把堆内存的对象转化成字节流的过程. * 反序列化:把字节流序列恢复重构成对象的过程. * 对象的序列化的用途:1.把对象的字节序列持久化, ...

  8. java基础知识回顾之javaIO类总结

    java IO体系图 IO流的操作规律总结: 1,明确体系: 数据源:InputStream ,Reader 数据汇:OutputStream,Writer 2,明确数据:因为数据分两种:字节,字符. ...

  9. java基础知识回顾之javaIO类---BufferedInputStream和BufferedOutputStream

    MP3的复制过程: package com.lp.ecjtu; import java.io.BufferedInputStream; import java.io.BufferedOutputStr ...

随机推荐

  1. c++ string 拼接 int错误

    程序中用到字符串和int合成字符串,受java习惯的影响,直接进行了字符串与int的+操作,结果不正确.查了一下才明白问题所在,记录一下string str=”abc”+1;输出为:bc,因为”abc ...

  2. Virtualizing WrapPanel VS toolkit:WrapPanel

    用toolkit:WrapPanel的时候,LIST太大,内存不行,等下我试试 Virtualizing WrapPanel这个 http://www.codeproject.com/Articles ...

  3. 使用DriverManager获取数据库连接

    DriverManager 是驱动的管理类 * 1).可以通过重载的getConnection() 方法获取数据库连接,较为方便 * 2).可以同时管理多个驱动程序,若注册了多个数据库连接,则调用ge ...

  4. 《postfix MAIL服务搭建(第一篇):》RHEL6

    初级篇:搭建发送端.接收端.邮件别名的添加从而达到邮件群发功能的实现. 我们都知道邮件服务器是2个服务端也就是说2个端口,一个是发送的端口,一个是收邮件的端口,我们平常所使用的发送,接收邮件的过程,只 ...

  5. javascript面向对象--自定义类型

    Javascript是基于原型实现面向对象的,因此并没有类和接口,它的对象也与其他基于类的语言中的对象有所不同.在Javascript中,每个对象都是基于一个引用类型创建的,这个引用类型可以是原生类型 ...

  6. 启语外语培训网SEO历程

    网站开发完成已经好长时间了,但收录一直上不去,排名也上不去.我这篇文章主要是分析一下网站的SEO历程 网址:http://waiyupx.cheer-edu.net/School/School-5.h ...

  7. 【Qt】Qt Linguist介绍【转】

    简介 Qt提供了一款优秀的支持Qt C++和Qt Quick应用程序的翻译工具.发布者.翻译者和开发者可以使用这款工具来完成他们的任务. 发布者:承担了全面发布应用程序的责任.通常,他们协调开发者和翻 ...

  8. MySQL数据库主从复制

    一.MySQ主从复制(主库写入数据,从库读取数据) MySql官方下载地址:http://dev.mysql.com/downloads/mysql/ MySql常用命令: 设置密码 UPDATE U ...

  9. nginx搭建流媒体服务器的方法详解

      一.FLV视频发布方式简介 FLV视频有两总发布方式 1.  HTTP方式 这种方式要下载FLV视频文件到本地播放,一旦FLV视频文件下载完成,就不会消耗服务器的资源和带宽,但是拖动功能没有RTM ...

  10. Unable to create the store directory. (Exception from HRESULT: 0x80131468)

    一个ASP.NET的程序,使用了MS ReportViewer报告控件,在用该控件导出生成Excel文件时,先是提示行不能超过65535. 这个是由于Excel2003的行限制的原因.由于修改成用Ex ...