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毫秒