- 浏览: 11517 次
- 性别:
- 来自: 大连
文章分类
最新评论
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毫秒
发表评论
-
sample io
2010-03-16 17:03 41import java.util.*; imp ... -
自己动手做留言板
2010-02-11 10:42 51这是一个用JSP实现的入 ... -
大三第一学期Java课程期末复习笔记整理 (2)
2010-01-27 15:20 1520大三第一学期Java课程期末复习笔记整理 (1) ... -
大三第一学期Java课程期末复习笔记整理 (1)
2010-01-27 14:05 1412这 是我在刚刚过去的一学期Java课 ... -
Java中的AutoBoxing (Integer对-128~127之间数值的特殊处理)
2010-01-24 17:26 123在 Java中的,Integer和int是可以A ... -
What is Object-Oriented
2009-12-29 23:35 93Java is an inherently Ob ... -
Difference between the complex class and the basic type when array is initialize
2009-12-29 23:18 43Introduction As we know, w ... -
Problem when the method next and the nextLine used at the same time
2009-12-11 22:09 1232Introduction Pro ...
相关推荐
File类的listFiles()方法可以返回指定目录下的所有文件和子目录,配合FileFilter或FilenameFilter接口可以实现自定义过滤条件。 在上传和下载文件时,通常涉及到网络IO,Java提供了Socket和ServerSocket类处理...
10. **文件过滤器:** 通过FileFilter和FilenameFilter,可以定制过滤文件或目录的逻辑,例如按名称、大小或日期进行筛选。 Apache Commons IO库广泛应用于各种Java项目中,无论是在简单的文件操作还是复杂的I/O...
配合FileFilter或FilenameFilter接口,可以实现自定义的文件筛选规则。 6. **文件属性**:File类提供了获取文件大小、最后访问时间、最后修改时间等属性的方法,如`length()`返回文件长度,`lastModified()`获取...
- FileFilter和FilenameFilter接口可定制文件筛选规则,如按扩展名、大小等条件过滤。 - 使用DirectoryStream类处理目录流,提供更灵活的迭代和过滤选项。 - BufferedReader和BufferedWriter可以高效地读写大文件...
- `listFiles()`: 返回目录中的所有文件和子目录File对象列表,可传入FileFilter或FilenameFilter进行筛选。 7. **NIO (New IO)**: - Java 1.4引入了NIO(非阻塞I/O),提供了Channel、Selector和Buffer等概念,...
此外,`java.nio`包提供了非阻塞I/O,增强了性能和效率。 3. **目录遍历**:通过File对象的`list()`或`listFiles()`方法,可以获取目录中的文件和子目录列表,从而实现资源的层级展示。 4. **多线程**:为了提升...
学会使用File类遍历目录、获取文件列表,以及使用FileFilter或FilenameFilter过滤文件,对于文件系统编程至关重要。此外,了解文件的读写权限和操作系统的文件结构也有助于解决实际问题。 #### 11. 进程与线程 理解...
可以使用`FileFilter`和` FilenameFilter `接口对文件或目录进行过滤,例如按扩展名筛选文件。 9. **文件通道(File Channel)**: `java.nio.channels.FileChannel`类提供了一种高效的方式进行大块数据的传输,...
// 如果需要包含子目录,可以传入FileFilter或FilenameFilter ``` **步骤二:选择文件** 在获取了目录中的所有文件后,我们可以根据需要筛选出特定类型的文件。例如,如果只想处理`.txt`文件: ```java List...
这通常涉及到比较文件的`length()`(文件大小)和`lastModified()`(最后修改时间)属性。例如,我们可以创建一个`FileFilter`实现,检查文件大小是否在特定范围内,或者文件是否在特定日期之后被修改。 此外,如果...
3. **文件过滤**:Java允许我们创建自定义的`FilenameFilter`或使用预定义的`FileFilter`,如`FileFilter:hidden`(隐藏文件)或`FileFilter::directories`(仅目录)。在搜索器中,我们可以根据文件名、扩展名或...
- `File`类提供了`list()`, `listFiles()`和`listFiles(FilenameFilter)`方法来获取指定目录下的文件或符合特定条件的文件。你可以通过自定义`FilenameFilter`或`FileFilter`接口来过滤文件名或文件属性。 ```...
`FileFilter`和`FilenameFilter`接口允许自定义文件选择规则,如选择特定扩展名的文件或指定日期内的文件。 6. **文件观察服务**: Java 7引入的`java.nio.file.FileSystemWatcher`服务可以监控文件系统的变化,...
3. **文件过滤**:`FilenameFilter` 和 `FileFilter` 接口提供了文件和目录过滤功能,可以按名称、扩展名或其他自定义条件筛选文件。此外,库还包含了一些预定义的过滤器,如 `DirectoryFileFilter.DIRECTORY` 只...
Java的`java.util.regex`包提供了正则表达式的支持,而`FileFilter`和`FilenameFilter`接口可以用来定制文件选择规则,如只显示某种类型的文件。 总的来说,"java 飞鸽传书 资源管理器"项目涵盖了Java的基础语法、...
虽然这些功能在性能和灵活性方面不如增强型IO包(`nio`),但对于理解Java核心IO模型至关重要。 #### IO包的结构 IO包中的类和接口种类繁多。根据功能和用途大致可以分为以下几类: 1. **接口** - `...
- `FilenameFilter` 和 `FileFilter` 接口用于实现自定义的文件或目录过滤规则。可以结合这些接口创建过滤器,如查找特定扩展名的文件或只列出目录。 6. **读写字符集**: - `Charsets` 类提供了一些标准的字符集...
可以使用`FileFilter`或`FilenameFilter`接口自定义过滤规则,比如只处理特定扩展名的文件。 5. **批量操作**: - **遍历目录**:使用`listFiles()`或`listFiles(FileFilter)`遍历目录及其子目录,执行批处理操作...
- `FileFilter`和`FilenameFilter`用于文件和目录的筛选。 - `Serializable`接口标记类可以被序列化,`Externalizable`接口允许自定义序列化逻辑。 理解并熟练掌握Java的I/O流系统对于开发涉及文件操作、网络通信...
- 例如,`FileFilter`和`FilenameFilter`接口也可用于自定义文件筛选规则。 5. **高级文件查询** - 使用`java.nio.file`包中的`Files`类,可以执行更复杂的文件查询操作,如查找最近修改的文件、查找指定大小的...