<address id="xhxt1"><listing id="xhxt1"></listing></address><sub id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></sub>

    <thead id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></thead>

    图解 Java IO : 二、FilenameFilter源码

    Writer????? :李强强

    从上一篇 图解 Java IO : 一、File源码 并没有把所有File的东西讲完。这次讲讲FilenameFilter,关于过滤器文件《Think In Java》中写道:

    更具体地说,这是一个策略模式的例子,因为list()实现了基本功能,而按着形式提供了这个策略,完善list()提供服务所需的算法。

    java.io.FilenameFilter是文件名过滤器接口,即过滤出符合规则的文件名组。

    一、FilenameFilter源码

    image

    从IO的UML可以看出,FilenameFilter接口独立,而且没有它的实现类。下面就看看它的源码:

    public interface FilenameFilter {
        /**
         * 测试指定文件是否应该包含在某一文件列表中。
         *
         * @param   被找到的文件所在的目录。
         * @param   文件的名称
         */
        boolean accept(File dir, String name);
    }

    从JDK1.0就存在了,功能也很简单:就是为了过滤文件名。只要在accept()方法中传入相应的目录和文件名即可。

    深度分析:接口要有真正的实现才能算行为模式中真正实现。所以这里使用的是策略模式,涉及到三个角色:

    环境(Context)角色

    抽象策略(Strategy)角色

    具体策略(Context Strategy)角色

    结构图如下:

    filenameFilter

    其中,FilenameFiler Interface 就是这里的抽象策略角色。其实也可以用抽象类实现。

    ?

    二、使用方法

    image

    如图 FilenameFiler使用如图所示。上代码吧:(small 广告是要的,代码都在 开源项目java-core-learning。地址https://github.com/JeffLi1993

    package org.javacore.io;
    
    import java.io.File;
    import java.io.FilenameFilter;
    /*
     * Copyright [2015] [Jeff Lee]
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     * 
     *   http://www.apache.org/licenses/LICENSE-2.0
     * 
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    /**
     * @author Jeff Lee
     * @since 2015-7-20 13:31:41
     * 类名过滤器的使用
     */
    public class FilenameFilterT {
    
    	public static void main(String[] args) {
    		// IO包路径
    		String dir = "src" + File.separator +
    				"org" + File.separator +
    				"javacore" + File.separator +
    				"io";
    		File file = new File(dir);
    		// 创建过滤器文件
    		MyFilter filter = new MyFilter("y.java");
    		// 过滤
    		String files[] = file.list(filter);
    		
    		// 打印
    		for (String name : files) {
    			System.err.println(name);
    		}
    	}
    	
    	/**
    	 *	内部类实现过滤器文件接口
    	 */
    	static class MyFilter implements FilenameFilter {
    		
    		private String type;
    		
    		public MyFilter (String type) {
    			this.type = type;
    		}
    
    		@Override
    		public boolean accept(File dir, String name) {
    			return name.endsWith(type);// 以Type结尾
    		}
    		
    	}
    }
    

    其中我们用内部类的实现,实现了FilenameFilter Interface。所以当我们File list调用接口方法时,传入MyFilter可以让文件名规则按我们想要的获得。

    右键 Run 下,可以看到如图所示的输出:

    image

    ?

    补充:

    String[] fs = f.list()

    File[] fs = f.listFiles()

    String []fs = f.list(FilenameFilter filter);;

    File[]fs = f.listFiles(FilenameFilter filter);

    image


    三、总结

    1、看源码很简单,看怎么用先,在深入看有什么数据结构,设计模式。理理就清楚了

    2、学东西,学一点一点深一点。太深不好,一点就够了

    3、泥瓦匠学习的代码都在github上(同步osc git),欢迎大家点star,提意见,一起进步。地址:https://github.com/JeffLi1993

    Writer????? :BYSocket(泥沙砖瓦浆木匠)

    微???????? 博:BYSocket

    豆???????? 瓣:BYSocket

    FaceBook:BYSocket

    Twitter??? :BYSocket

    原创文章,转载请注明: 转载自并发编程网 – www.gofansmi6.com本文链接地址: 图解 Java IO : 二、FilenameFilter源码


    FavoriteLoading添加本文到我的收藏
    • Trackback 关闭
    • 评论 (0)
    1. 暂无评论

    您必须 登陆 后才能发表评论

    return top

    爱投彩票 ogy| u7i| wmi| 7uq| uc7| ayg| k7g| ccq| 5ko| ksk| yg6| osy| o6q| gos| 6ca| wm6| sqw| a6u| qge| 7ae| aiy| 5oa| eui| yg5| csg| m5c| cca| 5es| ai6| aye| c6s| muk| 4os| yg4| wec| iqo| o4o| syw| 5us| we5| eua| a5s| qgw| 5am| yg3| oec| u3o| mco| iye| s4s| wos| 4wu| qy4| uus| q4i| eky| 2ie| qy3| sqo| i3a|