`

FileFilter和FilenameFilter类性能比较

    博客分类:
  • JAVA
阅读更多

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

 

    (什么是FileFilter?         什么是FilenameFilter?

 

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

 

    方法:在一个目录中创建20000txt 文件,分别用实现了以上两个接口的类来搜索这个目录中的所有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毫秒

  • 大小: 9 KB
2
1
分享到:
评论

相关推荐

    IO各种操作文件,字符流、字节流等

    File类的listFiles()方法可以返回指定目录下的所有文件和子目录,配合FileFilter或FilenameFilter接口可以实现自定义过滤条件。 在上传和下载文件时,通常涉及到网络IO,Java提供了Socket和ServerSocket类处理...

    jar包-commons-io-2.4.jar

    10. **文件过滤器:** 通过FileFilter和FilenameFilter,可以定制过滤文件或目录的逻辑,例如按名称、大小或日期进行筛选。 Apache Commons IO库广泛应用于各种Java项目中,无论是在简单的文件操作还是复杂的I/O...

    VIP09_JavaSE_JavaIO_File_day0307-1.rar

    配合FileFilter或FilenameFilter接口,可以实现自定义的文件筛选规则。 6. **文件属性**:File类提供了获取文件大小、最后访问时间、最后修改时间等属性的方法,如`length()`返回文件长度,`lastModified()`获取...

    android 快速的搜索手机文件引擎 java I/O的应用

    - FileFilter和FilenameFilter接口可定制文件筛选规则,如按扩展名、大小等条件过滤。 - 使用DirectoryStream类处理目录流,提供更灵活的迭代和过滤选项。 - BufferedReader和BufferedWriter可以高效地读写大文件...

    java 文件操作

    - `listFiles()`: 返回目录中的所有文件和子目录File对象列表,可传入FileFilter或FilenameFilter进行筛选。 7. **NIO (New IO)**: - Java 1.4引入了NIO(非阻塞I/O),提供了Channel、Selector和Buffer等概念,...

    Java资源管理器

    此外,`java.nio`包提供了非阻塞I/O,增强了性能和效率。 3. **目录遍历**:通过File对象的`list()`或`listFiles()`方法,可以获取目录中的文件和子目录列表,从而实现资源的层级展示。 4. **多线程**:为了提升...

    Java程序员必会的程序

    学会使用File类遍历目录、获取文件列表,以及使用FileFilter或FilenameFilter过滤文件,对于文件系统编程至关重要。此外,了解文件的读写权限和操作系统的文件结构也有助于解决实际问题。 #### 11. 进程与线程 理解...

    java 文件操作类

    可以使用`FileFilter`和` FilenameFilter `接口对文件或目录进行过滤,例如按扩展名筛选文件。 9. **文件通道(File Channel)**: `java.nio.channels.FileChannel`类提供了一种高效的方式进行大块数据的传输,...

    知道文件目录后 获取文件的内容

    // 如果需要包含子目录,可以传入FileFilter或FilenameFilter ``` **步骤二:选择文件** 在获取了目录中的所有文件后,我们可以根据需要筛选出特定类型的文件。例如,如果只想处理`.txt`文件: ```java List...

    Java实现本地文档单多搜索

    这通常涉及到比较文件的`length()`(文件大小)和`lastModified()`(最后修改时间)属性。例如,我们可以创建一个`FileFilter`实现,检查文件大小是否在特定范围内,或者文件是否在特定日期之后被修改。 此外,如果...

    java编写的文件搜索器

    3. **文件过滤**:Java允许我们创建自定义的`FilenameFilter`或使用预定义的`FileFilter`,如`FileFilter:hidden`(隐藏文件)或`FileFilter::directories`(仅目录)。在搜索器中,我们可以根据文件名、扩展名或...

    有关于文件的搜索(java)

    - `File`类提供了`list()`, `listFiles()`和`listFiles(FilenameFilter)`方法来获取指定目录下的文件或符合特定条件的文件。你可以通过自定义`FilenameFilter`或`FileFilter`接口来过滤文件名或文件属性。 ```...

    Java_Advanced_Programming_File_Directory_code.rar_java programmi

    `FileFilter`和`FilenameFilter`接口允许自定义文件选择规则,如选择特定扩展名的文件或指定日期内的文件。 6. **文件观察服务**: Java 7引入的`java.nio.file.FileSystemWatcher`服务可以监控文件系统的变化,...

    commons-io-2.6-bin.rar

    3. **文件过滤**:`FilenameFilter` 和 `FileFilter` 接口提供了文件和目录过滤功能,可以按名称、扩展名或其他自定义条件筛选文件。此外,库还包含了一些预定义的过滤器,如 `DirectoryFileFilter.DIRECTORY` 只...

    java 飞鸽传书 资源管理器

    Java的`java.util.regex`包提供了正则表达式的支持,而`FileFilter`和`FilenameFilter`接口可以用来定制文件选择规则,如只显示某种类型的文件。 总的来说,"java 飞鸽传书 资源管理器"项目涵盖了Java的基础语法、...

    java jdk io包类详解

    虽然这些功能在性能和灵活性方面不如增强型IO包(`nio`),但对于理解Java核心IO模型至关重要。 #### IO包的结构 IO包中的类和接口种类繁多。根据功能和用途大致可以分为以下几类: 1. **接口** - `...

    commons-io-2.6.jar下载

    - `FilenameFilter` 和 `FileFilter` 接口用于实现自定义的文件或目录过滤规则。可以结合这些接口创建过滤器,如查找特定扩展名的文件或只列出目录。 6. **读写字符集**: - `Charsets` 类提供了一些标准的字符集...

    文件批处理模块_java_批处理_源码

    可以使用`FileFilter`或`FilenameFilter`接口自定义过滤规则,比如只处理特定扩展名的文件。 5. **批量操作**: - **遍历目录**:使用`listFiles()`或`listFiles(FileFilter)`遍历目录及其子目录,执行批处理操作...

    北大Java--IO

    - `FileFilter`和`FilenameFilter`用于文件和目录的筛选。 - `Serializable`接口标记类可以被序列化,`Externalizable`接口允许自定义序列化逻辑。 理解并熟练掌握Java的I/O流系统对于开发涉及文件操作、网络通信...

    java文件检索

    - 例如,`FileFilter`和`FilenameFilter`接口也可用于自定义文件筛选规则。 5. **高级文件查询** - 使用`java.nio.file`包中的`Files`类,可以执行更复杂的文件查询操作,如查找最近修改的文件、查找指定大小的...

Global site tag (gtag.js) - Google Analytics