FileFilter和FilenameFilter类性能比较(zz)

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

 

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

 

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

    结果:FilenameFilter性能好于FileFilter。



 

 

   首先是个工具类:niTimer.java

Java代码   收藏代码
  1. package cn.nileader.io;  
  2. /** 
  3.  *  @author nileader 
  4.  * @see http://www.nileader.cn 
  5.  */  
  6. class niTimer {    
  7.      
  8.      /*  
  9.       * 构造方法  
  10.       */    
  11.      public niTimer() {    
  12.          this.reSet();    
  13.     }    
  14.      
  15.      /*  
  16.       * 开始计时  
  17.       */    
  18.      public void start() {    
  19.           this.isRunning = true;    
  20.           this.startTime = System.currentTimeMillis();    
  21.       }    
  22.       
  23.       /*  
  24.        * 停止计时  
  25.        */    
  26.       public void end() {    
  27.           this.isRunning = false;    
  28.           long endTime = System.currentTimeMillis();    
  29.           this.useTime = endTime - this.startTime;    
  30.       }    
  31.       
  32.       /*  
  33.        * 初始化 使this.useTime = 0;  
  34.        */    
  35.       public void reSet() {    
  36.           this.useTime = 0;    
  37.           this.isRunning = false;    
  38.       }    
  39.       
  40.       /*  
  41.        * 过去所用时间  
  42.        */    
  43.       public long getUseTime() {    
  44.                return useTime;    
  45.       }    
  46.       
  47.       private long startTime;    
  48.       private long useTime;    
  49.       private boolean isRunning;    
  50.       
  51.       public long getStartTime() {    
  52.           return startTime;    
  53.       }    
  54.       
  55.       public void setStartTime(long startTime) {    
  56.           this.startTime = startTime;    
  57.       }    
  58.       
  59.       
  60.       public void setUseTime(long useTime) {    
  61.           this.useTime = useTime;    
  62.       }    
  63.       
  64.           
  65.   }    

 

 

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

   

     niFileFilter.java

 

Java代码   收藏代码
  1. <strong>package cn.nileader.io;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileFilter;  
  5.   
  6. /** 
  7.  * 继承FileFilter接口的文件检索类 
  8.  * @author nileader 
  9.  * @see http://www.nileader.cn 
  10.  */  
  11. class niFileFilter  implements FileFilter{  
  12.     public String  dat;     //定义的扩展名  
  13.     public String getDat() {  
  14.         return dat;  
  15.     }  
  16.     public void setDat(String dat) {  
  17.         this.dat = dat;  
  18.     }  
  19.     /** 
  20.      * 构造方法 
  21.      */  
  22.     public niFileFilter(String dat){  
  23.         this.setDat(dat);  
  24.     }  
  25.     /** 
  26.      * 过滤的方法 
  27.      * @param file 待查询的文件对象 
  28.      * @return 是否符合指定文件 
  29.      */  
  30.     public boolean accept(File file) {  
  31.                       
  32.                 //如果file是个目录  
  33.               if(file.isDirectory()) return false;  
  34.                   
  35.                 String fileName = file.getName();  
  36.                 //对获取的文件全名进行拆分  
  37.                 String[] arrName = fileName.split("\\.");  
  38.                 if(arrName[1].equalsIgnoreCase( this.getDat() ) )  
  39.                 {  
  40.                     return true;  
  41.                 }  
  42.         return false;  
  43.     }  
  44. }</strong>  

 

niFilenameFilter.java

Java代码   收藏代码
  1. <strong>package cn.nileader.io;  
  2.   
  3. import java.io.File;  
  4. import java.io.FilenameFilter;  
  5.   
  6. /** 
  7.  * 继承FileFilter接口的文件检索类 
  8.  * @author nileader 
  9.  * @see http://www.nileader.cn 
  10.  */  
  11. class niFilenameFilter  implements FilenameFilter{  
  12.     public String  dat;     //定义的扩展名  
  13.     public String getDat() {  
  14.         return dat;  
  15.     }  
  16.     public void setDat(String dat) {  
  17.         this.dat = dat;  
  18.     }  
  19.     /** 
  20.      * 构造方法 
  21.      */  
  22.     public niFilenameFilter(String dat){  
  23.         this.setDat(dat);  
  24.     }  
  25.     /** 
  26.      * 过滤的方法 
  27.      * @param file 待查询的文件对象 
  28.      * @return 是否符合指定文件 
  29.      */  
  30.     public boolean accept(File dir, String fileName) {  
  31.           
  32.         //对获取的文件全名进行拆分  
  33.         String[] arrName = fileName.split("\\.");  
  34.         if(arrName[1].equalsIgnoreCase( this.getDat() ) )  
  35.         {  
  36.             return true;  
  37.         }  
  38.         return false;  
  39.     }  
  40. }</strong>  

 

 

    测试程序二:

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

 

Java代码   收藏代码
  1. package cn.nileader.io;  
  2. import java.io.File;  
  3. import java.io.FileFilter;  
  4.   
  5.   
  6. /** 
  7.  * 测试类 
  8.  */  
  9. public class niFFTest{  
  10.     public static void main(String[] args) throws Exception{  
  11. //      // 生成大量文件  
  12. //      for(int i=0; i<20000; i++)  
  13. //      {  
  14. //          File file = new File("P:/Temp/java/nichao"+i+".txt");  
  15. //          file.createNewFile();  
  16. //      }  
  17.                  //计时实例  
  18.         niTimer myTimer = new niTimer();    
  19.           
  20. //以下是采用niFilenameFilter来搜索文件  
  21.          niFilenameFilter nfnf = new niFilenameFilter("txt");     
  22.          //搜索文件  
  23.          File file2 = new File("P:/Temp/java/");  
  24.          //计时开始       
  25.          myTimer.start();  
  26.          File filelist2[] = file2.listFiles(nfnf);    
  27.          //计时结束  
  28.          myTimer.end();    
  29.          System.out.println("使用niFilenameFilter接口,用时 "+myTimer.getUseTime()+"毫秒" );  
  30.   
  31.   
  32.   
  33.           
  34.         //以下是采用niFileFilter来搜索文件  
  35.         niFileFilter nff = new niFileFilter("txt");  
  36.         //搜索文件  
  37.         File file = new File("P:/Temp/java/");  
  38.         //计时开始  
  39.         myTimer.start();   
  40.         File filelist[] = file.listFiles(nff);  
  41.          //计时结束  
  42.          myTimer.end();    
  43.          System.out.println("使用FileFilter接口,用时 "+myTimer.getUseTime()+"毫秒" );         
  44.            
  45.            
  46.            
  47.            
  48.     }  
  49. }  

 

  第一次:

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

     第二次:

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

测试程序一:

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

Java代码   收藏代码
  1. package cn.nileader.io;  
  2. import java.io.File;  
  3. import java.io.FileFilter;  
  4.   
  5.   
  6. /** 
  7.  * 测试类 
  8.  */  
  9. public class niFFTest{  
  10.     public static void main(String[] args) throws Exception{  
  11. //      // 生成大量文件  
  12. //      for(int i=0; i<20000; i++)  
  13. //      {  
  14. //          File file = new File("P:/Temp/java/nichao"+i+".txt");  
  15. //          file.createNewFile();  
  16. //      }  
  17.                  //计时实例  
  18.         niTimer myTimer = new niTimer();    
  19.           
  20.           
  21.         //以下是采用niFileFilter来搜索文件  
  22.         niFileFilter nff = new niFileFilter("txt");  
  23.         //搜索文件  
  24.         File file = new File("P:/Temp/java/");  
  25.         //计时开始  
  26.         myTimer.start();   
  27.         File filelist[] = file.listFiles(nff);  
  28.          //计时结束  
  29.          myTimer.end();    
  30.          System.out.println("使用FileFilter接口,用时 "+myTimer.getUseTime()+"毫秒" );         
  31.            
  32.          //以下是采用niFilenameFilter来搜索文件  
  33.          niFilenameFilter nfnf = new niFilenameFilter("txt");     
  34.          //搜索文件  
  35.          File file2 = new File("P:/Temp/java/");  
  36.          //计时开始       
  37.          myTimer.start();  
  38.          File filelist2[] = file2.listFiles(nfnf);    
  39.          //计时结束  
  40.          myTimer.end();    
  41.          System.out.println("使用niFilenameFilter接口,用时 "+myTimer.getUseTime()+"毫秒" );  
  42.            
  43.            
  44.     }  
  45. }  

 

 

最终的测试结果是:

   第一次:

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

   第二次:

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

  • 使用FilenameFilter实现图片过滤,只要.gif,.jpg,.png文件。

    java 代码
    1. public class ImageFilter  implements FilenameFilter{   
    2.   
    3.   public boolean isGif(String file) {   
    4.     if (file.toLowerCase().endsWith(".gif")){   
    5.       return true;   
    6.     }else{   
    7.       return false;   
    8.     }   
    9.   }   
    10.   public boolean isJpg(String file){   
    11.     if (file.toLowerCase().endsWith(".jpg")){   
    12.       return true;   
    13.     }else{   
    14.       return false;   
    15.     }   
    16.   }   
    17.   
    18.   public boolean isPng(String file){   
    19.     if (file.toLowerCase().endsWith(".png")){   
    20.       return true;   
    21.     }else{   
    22.       return false;   
    23.     }   
    24.   }   
    25.   public boolean accept(File dir,String fname){   
    26.     return (isGif(fname) || isJpg(fname) || isPng(fname));   
    27.   
    28.   }   
    29.   
    30. }   
    31.   

    程序测试类:

    java 代码
    1. public class ImageFilterTest{   
    2.     public static void main(String[] args){   
    3.         File directory=new File("E:\\program\\FilenameFilter\\images");   
    4.         String[] images = directory.list(new ImageFilter());   
    5.         System.out.println("size="+images.length);   
    6.         for (int i = 0; i < images.length; i++){   
    7.              String imgfile=images[i];   
    8.              System.out.println("imgfile="+imgfile);   
    9.         }   
    10.     }   
    11. }   

    ImageFilter 类对象的任务就是提供一个accept( )的方法。之所以要创建这个类,就是要给list( )提供一个accept( )方法,这样当list( )判断该返回哪些文件名的时候,能够"回过头来调用"accept( )方法。因此,这种结构通常被称为回调(callback)。更准确地说,由于list( )实现了基本功能,而FilenameFilter提供了"对外服务所需的算法",因此这是一种"策略模式(Strategy Pattern)"。由于list( )拿FilenameFilter对象当参数,因此你可以将任何实现FilenameFilter接口的对象传给它,并以此(甚至是在运行时)控制list( )的工作方式。回调能提高程序的灵活性。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值