黑马程序员——IO之文件名过滤器

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

文件名过滤器的源码解析

文件名过滤器的作用是:
	把指定目录中符合要求的文件名提取出来,一般用在对给定目录中的文件进行处理的操作中。
	例:把E盘下以.jpg结尾的文件名输出。
	分析:
		A:把符合要求的文件名提取出来,存放在一个数组中
			文件名过滤器可以帮做我们把符合要求的文件名提取出来
		B:遍历数组也就得到了想要的结果。
文件名过滤器是怎么实现的呢?

	File file = new File("e:\\");
	
	String[] strArray = file.list(FilenameFilter fileter);
	//通过list方法获取文件名数组,这里如果list方法中没有参数则返回由所有文件名组成的数组
	//如果有FilenameFilter对象做参数,这要经过FilenameFilter的accept方法判断后返回符合条件的文件名添加到数组中。
	
	/*
		看list的方法源码:
			public String[] list(FilenameFilter filter) {
		        String names[] = list();
		        if ((names == null) || (filter == null)) {	//如果list方法中没有参数直接返回字符串数组
		            return names;
		        }
		        List<String> v = new ArrayList<>();		//如果有文件名过滤器,则执行这些操作
		        for (int i = 0 ; i < names.length ; i++) {
		            if (filter.accept(this, names[i])) {
		            //this代表调用list方法的File对象
		            //name[i]代表File.list返回的数组中各个元素
		            //即把File对象和没有经过判断组成的数组各元素传递给accept方法,我们可以重写accept方法来得到自己想要的结果
		                v.add(names[i]);
		            }
		        }
		        return v.toArray(new String[v.size()]);
	   		}
	   	
	   	查看FilenameFilter
	   	public interface FilenameFilter {
	    	boolean accept(File dir, String name);
		}
		发现这个FilenameFilter只是一个接口,且接口中只有一个accept方法
		如果一个方法的形式参数是一个接口,说明实际参数应该是这个接口的子类对象,
		需要重写这个方法。
	*/
	
	new FilenameFilter() {
			@Override
			public boolean accept(File dir, String name) {
				return new File(dir, name).isFile() && name.endsWith(".jpg");		//即如果File对象下有以".jpg"结尾的文件则返回true
				//然后list方法会把其添加到数组中
}}

 总结: 

     当list方法中有FilenameFilter参数时,list会在方法内先生成一个没有经过判断的数组,并把对象(File dir)和数组中的元素(String name)传递给

FilenameFilter的accept方法,我们可以重写accept方法,来得到满足条件的文件名。当accept方法的返回值为true时,list才真正的把其放到返回的数组中。

实例:

import java.io.File;
import java.io.FilenameFilter;

/*
 * 把f盘下以.txt结尾的文件的文件名输出。
 * FilenameFilter解析		
 */
public class FilenameFilterDemo {

	public static void main(String[] args) {
		//指向F盘
		File filef = new File("f:\\");
		
		//把F盘封装为一个数组,并利用文件名过滤器提取出符合要求的文件名
		String[] st = filef.list(new FilenameFilter() {
			
			@Override
			public boolean accept(File dir, String name) {
				return new File(dir,name).isFile() && name.endsWith(".txt");
			}
		});
		
		//遍历数组
		for(String s :st){
			System.out.println(s);
		}
		
	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一夸克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值