【转】File类应用 - FilenameFilter 和 FileFilter
FilenameFilter & FileFilter
FilenameFilter 和 FileFilter 都是用来过滤文件,例如过滤,以.jpg或者.java结尾的文件,通过看他们的源码:通过使用File类中String[] list(FilenameFilter filter)或者public File[] listFiles(FileFilter filter)方法,把FilenameFilter或者FileFilter接口对象作为参数传入,通过实现接口里面的 boolean accept(File dir, String name) 或者boolean accept(File pathname)方法来过滤出满足条件的文件。区别:FilenameFilter的性能比FileFilter的好.
public File[] listFiles(FileFilter filter)
返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。除了返回数组中的路径名必须满足过滤器外,此方法的行为与 listFiles() 方法相同。如果给定 filter 为 null,则接受所有路径名。否则,当且仅当在路径名上调用过滤器的 FileFilter.accept(java.io.File) 方法返回 true 时,该路径名才满足过滤器。
/**
File类:
* 使用 String[] list(FilenameFilter filter)遍历指定目录下面,指定的后缀的文件。
底层怎么实现过滤的?
String[] list(FilenameFilter filter)
原理:先把目录下面的文件调用list()方法全部存放到一个String[]数组里面,然后遍历数组,
把符合filter.accept(this, names[i])条件的放到一个ArrayList里面,然后把
List转化为String[]数组
底层源码解析:
public String[] list(FilenameFilter filter) {
String names[] = list();//把所有目录文件列出来
if ((names == null) || (filter == null)) {//如果没有目录或者文件,返回null
return names;
}
ArrayList v = new ArrayList();
for (int i = 0 ; i < names.length ; i++) {//找到文件,遍历
if (filter.accept(this, names[i])) {
v.add(names[i]);/把满足条件的放到List集合中
}
}
return (String[])(v.toArray(new String[v.size()]));
}
* FilenameFilter 接口
* 接口方法:
* boolean accept(File dir,String name) 可以使用此方法列出指定目录下面的带有某些后缀的文件。
参数:
dir - 被找到的文件所在的目录。
name - 文件的名称。
返回:
当且仅当该名称应该包含在文件列表中时返回 true;否则返回 false。
*
*/
代码:
1.需求找出某个路径下面以.java结尾的文件。
实现:FilenameFilter 接口:
package com.lp.ecjtu.File.filter; import java.io.File;
import java.io.FilenameFilter; public class FileterByJava implements FilenameFilter { private String SufixName;//传入过滤的名称
public FileterByJava(String SufixName){
this.SufixName = SufixName;
} @Override
public boolean accept(File dir, String name) {
//System.out.println("dir"+dir+"_____"+"name"+name);//返回dir:E:\workspace\IOTest_____name:buf.txt
} }
package com.lp.ecjtu.File.filter; import java.io.File;
import java.io.FilenameFilter; public class FileListFilter { public static void main(String[] args){
ListFileFileterByjava();
} /**
*
* 使用实现FilenameFilter接口的方法,
* 过滤String[] list(FilenameFilter filter)
* 文件名过滤
*/
public static void ListFileFileterByjava(){
File f = new File("E:"+File.separator+"workspace"+File.separator+"IOTest");
String[] fileNames = f.list(new FileterByJava(".java"));//使用具体对象,把过滤后的以.java文件的文件放到数组当中
System.out.println(fileNames.length);//含有.java文件数组的长度
for(String name:fileNames){//遍历找到的.java文件
System.out.println(name);
} } /**
* 列出指定目录下,后缀为.java的文件,使用方法String[] list(FilenameFilter filter)使用匿名内部类的方法
*/
public static void ListFileNameFileter(){
File f = new File("E:"+File.separator+"workspace"+File.separator+"IOTest");
String[] files = f.list(new FilenameFilter() {//使用匿名内部类的方法 @Override
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub
//System.out.println("dir:"+dir+"name....."+name);//测试说明dir表示指定目录,name表示指定目录的名称
return name.endsWith(".java");//通过匿名内部类的返回值来控制指定目录下面的文件和文件夹的显示,只显示.java文件
}
});
System.out.println(files.length);
//遍历指定目录下面的文件和目录
for(String file:files){
System.out.println(file);
}
}
}
/ * FileFilter接口
* 接口方法:
* boolean accept(File dir) 可以使用此方法列出指定目录下面的带有某些后缀的文件。
参数:
dir - 被找到的文件所在的目录。
返回:
当且仅当该名称应该包含在文件列表中时返回 true;否则返回 false。
*/
代码:
需求:现在要求输入一个文件的目录,之后将里面所有的备份文件删除,备份文件都是以“.bak”或".BAK"结尾,也就是说过滤文件类型为.bak或者.BAK文件后进行删除.
第一种方法,使用FileFilter内部类的方法,进行操作:
代码:
package com.lp.ecjtu.File.filter; import java.io.File;
import java.io.FileFilter; public class FileFilterDemo { public static void main(String[] args){
File dir = new File("E:\\复件 demodir");
ListFileFileter(dir);
}
/**
* 现在要求输入一个文件的目录,之后将里面所有的备份文件删除,备份文件都是以“.bak”或".BAK"结尾,过滤文件类型为.bak文件
*/
public static void ListFileFileter(File dir){
if(dir.exists()){
//匿名内部类,把FileFilter接口对象作为参数
File[] files = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
if(pathname.isDirectory()){
return true;
}
String name = pathname.getName();//获取文件的名称E:\复件 demodir\Learn\sgim_piccell.v1.bin.bak
System.out.println("****************"+pathname);
return name.endsWith(".bak")|| name.endsWith(".BAK");//过滤文件类型为.bak或者.BAK文件,而不包含.BAK或者.bak的文件
}
});
//深度遍历文件,递归
for(int i=0;i<files.length;i++){
if(files[i].isFile()){//如果遍历到的是文件,直接删除
files[i].delete();
}else{//还是目录,继续遍历,直到是文件,再删除
ListFileFileter(files[i]);
}
}
}else{
throw new RuntimeException("操作的文件或者目录不存在!");
}
}
}
第二中方法实现接口,使用真实类的对象:
package com.lp.ecjtu.File.filter; import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
/**
*
* 需求:输入一个文件目录,之后将里面所有备份的文件删除,备份文件都是以".bak" 和".BAK"结尾
*
*/
public class FileterByFile implements FileFilter { @Override
public boolean accept(File pathname) {
if(pathname.isDirectory()){
return true;
}
String name = pathname.getName();
// TODO Auto-generated method stub
System.out.println("****************"+pathname);
return name.endsWith(".bak")|| name.endsWith(".BAK");
} }
package com.lp.ecjtu.File.filter; import java.io.File;
import java.io.FileFilter; public class FileFilterDemo { public static void main(String[] args){
File dir = new File("E:\\复件 demodir");
ListFileFileterBak(dir);
}
/**
* 删除满足条件的文件
* @param dir
*/
public static void ListFileFileterBak(File dir){
if(dir.exists()){
File[] files = dir.listFiles(new FileterByFile());//使用过滤
for(File file:files){
if(file.isDirectory()){
ListFileFileterBak(file);
}else{
file.delete();
}
}
}else{
throw new RuntimeException("操作的文件或者目录不存在!");
}
}
}
【转】File类应用 - FilenameFilter 和 FileFilter的更多相关文章
- java基础知识回顾之javaIO类--File类应用:过滤器接口FilenameFilter和FileFilter
FilenameFilter和FileFilter都是用来过滤文件,例如过滤,以.jpg或者.java结尾的文件,通过看他们的源码:通过使用File类中String[] list(FilenameFi ...
- [原创]Java中使用File类的list方法获取一定数量的文件:FilenameFilter接口的特殊用法
前言:有时候我们可能会遇到这样一个问题:需要遍历一个包含极多文件的文件夹,首先想到的肯定是使用File.list()方法,该方法返回一个String[],但是如果文件达到几亿呢?这个时候我们就需要分批 ...
- Java基础知识强化之IO流笔记10:File类输出指定目录下指定后缀名的文件名称案例(File类的文件过滤器方法改进list( FilenameFilter ff))
1. 案例: 判断F盘下是否有后缀名为.jpg的文件,如果有的话,就输出这个文件名. 2. 案例代码如下: (1)思路是:先获取所有的文件和文件夹封装的对象,然后遍历的时候,依次判断,如果满足条件就输 ...
- I/O流——File类及使用
I/O框架介绍 I/O是计算机输入/输出的接口.Java的核心库java.io提供了全方面的I/O接口,包括:文件系统的操作,文件读写,标准设备的输出等. File类及使用 ① 一个File类的对 ...
- Java File类总结和FileUtils类
Java File类总结和FileUtils类 文件存在和类型判断 创建出File类的对象并不代表该路径下有此文件或目录. 用public boolean exists()可以判断文件是否存在. Fi ...
- File类
存储在变量,数组和对象中的数据是暂时的,当程序终止时他们就会丢失.为了能够永久的保存程序中创建的数据,需要将他们存储到硬盘或光盘的文件中.这些文件可以移动,传送,亦可以被其他程序使用.由于数据存储在文 ...
- 黑马程序员——【Java基础】——File类、Properties集合、IO包中的其他类
---------- android培训.java培训.期待与您交流! ---------- 一.File类 (一)概述 1.File类:文件和目录路径名的抽象表现形式 2.作用: (1)用来将文件或 ...
- 第二十天File类、字节流
File类.字节流 File类 File类介绍 File:它是描述持久设备上的文件或文件夹的.只要是在Java程序中操作文件或文件夹肯定需要使用File类完成. File类构造方法 /* * File ...
- 详谈JAVA中的file类与IO流
File类 位置于java.io包构造方法:File(String parent, String child)new file("d:\\","a.txt") ...
随机推荐
- WinForm中MouseEnter和MouseLeave混乱的问题
MouseEnter+MouseLeave不行,我用了MouseMove+MouseLeave,效果一样 最近做个聊天的系统,仿照qq的界面设计,像qq聊天界面中字体.表情.截图等图片,鼠标放上去显示 ...
- Mysql导入导出非常慢解决办法
MySQL导出的SQL语句在导入时有可能会非常非常慢,经历过导入仅45万条记录,竟用了近3个小时.在导出时合理使用几个参数,可以大大加快导入的速度. -e 使用包括几个VALUES列表的多行INSER ...
- mac环境brew安装freetype,imagick等yii2所需要的库
之前整理了一下内置的php环境,各种缺库是很坑爹的,而且内置的php编译目录找了老半天没找到.所以决定使用brew去重新编译一边php brew的安装就不说了,上篇博客有说.直入主题 brew安装完p ...
- HTTP 源码解读
作用域:调用函数,访问变量的能力有关 作用域分为:局部和全局(在局部作用域里可以访问到全局作用域的变量,但在局部作用域外面就访问不到局部作用里面所设定的变量) 上下文:与this关键字有关 是调用当前 ...
- css3实现颜色渐变以及兼容性处理
有时我们会看到网站上的一些图片是渐变色的,这些图片有的是ui设计出来的,有的则是直接通过css3制作出来的.下面就讲一下css3实现渐变色的方法,以及在各个浏览器上的兼容性. CSS3 Gradien ...
- thinkPHP 标题
在控制器中 $this->meta_title='标题'; 在对应模板中 {$meta_title} 可以这样对模板中的变量直接进行赋值
- CSS轮廓outline
http://www.cnblogs.com/xiaohuochai/p/5277416.html
- Linux内核分析课程总结
Linux内核分析课程总结 By 20135203齐岳 知识梳理 (思维导图地址http://mindmap.4ye.me/mkxM0cFh/1) 从start _ kernel构造一个新的Linux ...
- Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)
Berkeley DB的数据存储结构 BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table).B树(BTree).队列(Queue) ...
- string to byte[]
在平常的开发过程中,经常碰到需要将string转化成byte[]字节数组的情形,有两种方法,在这里总结一下. 使用MemoryStream 代码如下. using (MemoryStream sb = ...