FileFilter和FilenameFilter类性能比较

来源:互联网 发布:hashset源码 编辑:程序博客网 时间:2024/06/10 19:03

FileFilter和FilenameFilter 两个接口是在文件搜索中常用的,有什么区别? 

 

    (什么是FileFilter?         什么是FilenameFilter? 

 

下面通过一个测试程序来初步检验两个接口的性能。

 

    方法:在一个目录中创建20000 个txt 文件,分别用实现了以上两个接口的类来搜索这个目录中的所有txt 文件,查看时间。

    结果:FilenameFilter性能好于FileFilter。



 

 

   首先是个工具类:niTimer.java

package cn.nileader.io;/** *  @author nileader * @see http://www.nileader.cn */class niTimer {          /*       * 构造方法       */       public niTimer() {           this.reSet();      }          /*       * 开始计时       */       public void start() {            this.isRunning = true;            this.startTime = System.currentTimeMillis();        }            /*        * 停止计时        */        public void end() {            this.isRunning = false;            long endTime = System.currentTimeMillis();            this.useTime = endTime - this.startTime;        }            /*        * 初始化 使this.useTime = 0;        */        public void reSet() {            this.useTime = 0;            this.isRunning = false;        }            /*        * 过去所用时间        */        public long getUseTime() {                 return useTime;        }            private long startTime;        private long useTime;        private boolean isRunning;            public long getStartTime() {            return startTime;        }            public void setStartTime(long startTime) {            this.startTime = startTime;        }                public void setUseTime(long useTime) {            this.useTime = useTime;        }                }  

 

 

  分别是两个实现了 FileFilter和FilenameFilter接口的类

   

     niFileFilter.java

 

package cn.nileader.io;import java.io.File;import java.io.FileFilter;/** * 继承FileFilter接口的文件检索类 * @author nileader * @see http://www.nileader.cn */class niFileFilter  implements FileFilter{public String  dat;     //定义的扩展名public String getDat() {return dat;}public void setDat(String dat) {this.dat = dat;}/** * 构造方法 */public niFileFilter(String dat){this.setDat(dat);}/** * 过滤的方法 * @param file 待查询的文件对象 * @return 是否符合指定文件 */public boolean accept(File file) { //如果file是个目录      if(file.isDirectory()) return false;String fileName = file.getName();//对获取的文件全名进行拆分String[] arrName = fileName.split("\\.");if(arrName[1].equalsIgnoreCase( this.getDat() ) ){return true;}return false;}}

 

niFilenameFilter.java

package cn.nileader.io;import java.io.File;import java.io.FilenameFilter;/** * 继承FileFilter接口的文件检索类 * @author nileader * @see http://www.nileader.cn */class niFilenameFilter  implements FilenameFilter{public String  dat;     //定义的扩展名public String getDat() {return dat;}public void setDat(String dat) {this.dat = dat;}/** * 构造方法 */public niFilenameFilter(String dat){this.setDat(dat);}/** * 过滤的方法 * @param file 待查询的文件对象 * @return 是否符合指定文件 */public boolean accept(File dir, String fileName) {//对获取的文件全名进行拆分String[] arrName = fileName.split("\\.");if(arrName[1].equalsIgnoreCase( this.getDat() ) ){return true;}return false;}}

 

 

    测试程序二:

     先执行 niFilenameFilter 接口实现,再执行 FileFilter 接口实现

 

package cn.nileader.io;import java.io.File;import java.io.FileFilter;/** * 测试类 */public class niFFTest{public static void main(String[] args) throws Exception{//// 生成大量文件//for(int i=0; i<20000; i++)//{//File file = new File("P:/Temp/java/nichao"+i+".txt");//file.createNewFile();//}         //计时实例niTimer myTimer = new niTimer();  //以下是采用niFilenameFilter来搜索文件         niFilenameFilter nfnf = new niFilenameFilter("txt");            //搜索文件         File file2 = new File("P:/Temp/java/");         //计时开始              myTimer.start();         File filelist2[] = file2.listFiles(nfnf);           //计时结束 myTimer.end();           System.out.println("使用niFilenameFilter接口,用时 "+myTimer.getUseTime()+"毫秒" );//以下是采用niFileFilter来搜索文件niFileFilter nff = new niFileFilter("txt");//搜索文件File file = new File("P:/Temp/java/");        //计时开始        myTimer.start(); File filelist[] = file.listFiles(nff); //计时结束 myTimer.end();           System.out.println("使用FileFilter接口,用时 "+myTimer.getUseTime()+"毫秒" );                                           }}

 

  第一次:

     使用niFilenameFilter接口,用时 219毫秒
     使用FileFilter接口,用时 797毫秒

     第二次:

     使用niFilenameFilter接口,用时 235毫秒
     使用FileFilter接口,用时 937毫秒

测试程序一:

     先执行FileFilter 接口实现,再执行niFilenameFilter 接口实现

package cn.nileader.io;import java.io.File;import java.io.FileFilter;/** * 测试类 */public class niFFTest{public static void main(String[] args) throws Exception{//// 生成大量文件//for(int i=0; i<20000; i++)//{//File file = new File("P:/Temp/java/nichao"+i+".txt");//file.createNewFile();//}         //计时实例niTimer myTimer = new niTimer();  //以下是采用niFileFilter来搜索文件niFileFilter nff = new niFileFilter("txt");//搜索文件File file = new File("P:/Temp/java/");        //计时开始        myTimer.start(); File filelist[] = file.listFiles(nff); //计时结束 myTimer.end();           System.out.println("使用FileFilter接口,用时 "+myTimer.getUseTime()+"毫秒" );                         //以下是采用niFilenameFilter来搜索文件         niFilenameFilter nfnf = new niFilenameFilter("txt");            //搜索文件         File file2 = new File("P:/Temp/java/");         //计时开始              myTimer.start();         File filelist2[] = file2.listFiles(nfnf);           //计时结束 myTimer.end();           System.out.println("使用niFilenameFilter接口,用时 "+myTimer.getUseTime()+"毫秒" );                  }}

 

 

最终的测试结果是:

   第一次:

   使用FileFilter接口,用时 906毫秒
   使用niFilenameFilter接口,用时 157毫秒

   第二次:

   使用FileFilter接口,用时 922毫秒
   使用niFilenameFilter接口,用时 156毫秒