javaIO类的File类应用:过滤器接口

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的好。

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。

代码:

  • 需求找出某个路径下面以.java结尾的文件。

实现:FilenameFilter 接口

import java.io.File;
import java.io.FilenameFilter; public class FileterByJava implements FilenameFilter { private String caiName;//传入过滤的名称
public FileterByJava(String caiName){
this.caiName = caiName;
} @Override
public boolean accept(File dir, String name) {
System.out.println("dir"+dir+"_____"+"name"+name);//返回dir:D:\cai\Test_____name:a.txt
} }
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("D:"+File.separator+"cai"+File.separator+"Test");
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("D:"+File.separator+"cai"+File.separator+"Test");
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,String name) 可以使用此方法列出指定目录下面的带有某些后缀的文件。

参数:

  • dir - 被找到的文件所在的目录。
  • name - 文件的名称。

返回:
当且仅当该名称应该包含在文件列表中时返回 true;否则返回 false。

代码

需求:现在要求输入一个文件的目录,之后将里面所有的备份文件删除,备份文件都是以“.bak”或".BAK"结尾,也就是说过滤文件类型为.bak或者.BAK文件后进行删除.

使用FileFilter内部类的方法,进行操作:

代码:

import java.io.File;
import java.io.FileFilter; public class CaiNiao { public static void main(String[] args){
File dir = new File("D:\\caidir");
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();//获取文件的名称D:\caidir\a.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("操作的文件或者目录不存在!");
}
}
}
/*
第二中方法实现接口,使用真实类的对象:
*/ 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");
} }
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("操作的文件或者目录不存在!");
}
}
}

最新文章

  1. Quartz.net持久化与集群部署开发详解
  2. Linux基础知识集锦
  3. ListView 完全优化 + 多种listitem布局处理
  4. DataTable排序的一般方法
  5. Knockout应用开发指南 第一章:入门
  6. c排序算法大全
  7. 小白日记2:kali渗透测试之被动信息收集(一)
  8. JXL组件生成报告错误(两)
  9. lodash源码分析之chunk的尺与刀
  10. IBM openblockchain学习(四)--crypto源代码分析
  11. 如何给filter添加自定义接口及调用
  12. gdb nnet3-compute
  13. 前端 -----js 定时器
  14. java8 Stream的实现原理 (从零开始实现一个stream流)
  15. SSH实现双向认证
  16. &lt;eq&gt;标签
  17. MariaDB Galera Cluster的配置测试
  18. 解析库之re、beautifulsoup、pyquery
  19. 【Swift】学习笔记(三)——字符和字符串
  20. yii2.0安装ElasticSearch及使用

热门文章

  1. WPF 枚举使用
  2. android studio学习----常用快捷键
  3. 【已采纳】新项目第一次怎么上传到github里面
  4. Linux下用火焰图进行性能分析【转】
  5. kolla部署openstack allinone,报错APIError: 500 Server Error: Internal Server Error (\&quot;oci runtime error: container_linux.go:235: starting container process caused \&quot;container init exited prematurely
  6. 机器学习(4)——PCA与梯度上升法
  7. 重新学习SpringMVC——补充
  8. Git命令行操作(三)
  9. 你真的了解FastClick吗?
  10. 如何确保redis中都是热数据