java iofilefilter 包_java IO--File类应用:过滤器接口FilenameFilter和FileFilter

转自  https://www.cnblogs.com/200911/p/3886802.html

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[]数组

底层源码解析:

1 publicString[] list(FilenameFilter filter) {2 String names[] = list();//把所有目录文件列出来

3 if ((names == null) || (filter == null)) {//如果没有目录或者文件,返回null

4 returnnames;5 }6 ArrayList v = newArrayList();7 for (int i = 0 ; i < names.length ; i++) {//找到文件,遍历

8 if (filter.accept(this, names[i])) {9 v.add(names[i]);/把满足条件的放到List集合中10 }11 }12 return (String[])(v.toArray(newString[v.size()]));13 }

*FilenameFilter 接口

* 接口方法:

* boolean accept(File dir,String name) 可以使用此方法列出指定目录下面的带有某些后缀的文件。

参数:

dir - 被找到的文件所在的目录。

name - 文件的名称。

返回:

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

*

*/

代码:

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

实现:FilenameFilter接口:

1 packagecom.lp.ecjtu.File.filter;2

3 importjava.io.File;4 importjava.io.FilenameFilter;5

6 public class FileterByJava implementsFilenameFilter {7

8 private String SufixName;//传入过滤的名称

9 publicFileterByJava(String SufixName){10 this.SufixName =SufixName;11 }12

13 @Override14 public booleanaccept(File dir, String name) {15 //System.out.println("dir"+dir+"_____"+"name"+name);//返回dir:E:\workspace\IOTest_____name:buf.txt

16 }17

18 }

48304ba5e6f9fe08f3fa1abda7d326ab.png

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);

}

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

/ *FileFilter接口

* 接口方法:

* boolean accept(File dir,String name) 可以使用此方法列出指定目录下面的带有某些后缀的文件。

参数:

dir - 被找到的文件所在的目录。

name - 文件的名称。

返回:

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

*/

代码:

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

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

代码:

48304ba5e6f9fe08f3fa1abda7d326ab.png

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

if(files[i].isFile()){//如果遍历到的是文件,直接删除

files[i].delete();

}else{//还是目录,继续遍历,直到是文件,再删除

ListFileFileter(files[i]);

}

}

}else{

throw new RuntimeException("操作的文件或者目录不存在!");

}

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

第二中方法实现接口,使用真实类的对象:

48304ba5e6f9fe08f3fa1abda7d326ab.png

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");

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

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("操作的文件或者目录不存在!");

}

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

Face your past without regret. Handle your present with confidence.Prepare for future without fear. keep the faith and drop the fear. 面对过去无怨无悔,把握现在充满信心,备战未来无所畏惧。保持信念,克服恐惧!一点一滴的积累,一点一滴的沉淀,学技术需要不断的积淀!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值