内容简介:java io文件过滤器对命令设计模式的使用
一. 点睛
java
io
流里面使用到了很多的设计模式,最典型的就是 装饰模式
,还有 命令模式
。通过对文件过滤器功能的简单使用,可以一窥 java
io
流对 命令设计模式
的典型使用。下面分两部分来讲,先举例说说文件过滤器的简单使用,再引申到它是如何使用到命令设计模式的,不会大篇幅讲模式,对命令模式想做更深入的了解请参考其他资料。
二. 示例
我们进行 java
编程的时候,如果想要访问文件或者目录,会使用 File
类, File
是一个很强大的类,不管文件还是目录都可以使用它。如果要遍历文件会使用到 File
类的 list()
方法,它会列出当前 File
对象的所有子文件名和路径名,如果有的文件名或者路径名不想要列出来怎么办? File
类给提供了另外一个重载的具有过滤功能的方法 list(FilenameFilter filter)
可以满足我们的需要,方法声明如下:
public String[] list(FilenameFilter filter);
参数里面的 FilenameFilter
就是文件名过滤接口,该接口有一个方法 accept()
方法,我们自定义的文件名过滤器需要实现该接口,并实现 accept()
方法来自定义规则。 FilenameFilter
接口声明如下所示:
public interface FilenameFilter { boolean accept(File dir, String name); }
下面来看具体怎么使用的,含义为列出当前工作空间下所有以 .xml
结尾的文件名或者路径名。
1. 编写自定义文件过滤器:
package org.light4j.io.fileFilter; import java.io.File; import java.io.FilenameFilter; /** * 自定义文件名过滤器 * * @author longjiazuo * */ public class MyFilenameFilter implements FilenameFilter { @Override public boolean accept(File dir, String name) { // 如果文件以.xml结尾则符合条件返回true return name.endsWith(".xml"); } }
2. 编写测试类
package org.light4j.io.fileFilter; import java.io.File; /** * 文件过滤器测试 * * <p> * 列出当前工作目录下符合条件的所有子文件名和路径名 * </p> * * @author longjiazuo * */ public class FilenameFilterTest { public static void main(String[] args) { // 获取工作目录 String workDir = System.getProperty("user.dir"); File file = new File(workDir); // 列举当前工作目录下的所有文件 String[] files = file.list(new MyFilenameFilter()); // 循环遍历 for (String string : files) { System.out.println(string); } } }
运行上面代码可以在控制台看到只列出以 .xml
结尾的文件名或者路径名。
三. 命令设计模式
命令模式是关于如何处理一个对象请求另外一个对象调用其方法完成某项功能的设计模式,当一个对象请求另外一个对象调用其方法时,并不和被请求的对象直接交互,而是把这种请求封装到一个命令对象中,具体做法是将请求封装在命令对象的一个方法里,将命令对象作为参数传递。 命令模式的核心就是使用命令对象来封装方法的调用。
在项目中,我们不会只有一个类,所以经常涉及一个对象请求另外一个对象调用它的方法来达到某种目的。如果请求者这时候不希望或者无法直接和被请求者进行交互,换句话说就是请求者不包含被请求者的引用,那么这个时候二者如何进行交互?我们可以使用命令模式来达到目的。例如,我们日常点外卖,我们并不直接和饭店打交道,而是会上美团等外卖网站购买,外卖网站会把你要买外卖的请求作为一个点餐命令告诉饭店,只要该点餐命令被成功传递给饭店,你就一定能够收到外卖。
现在回到文件过滤器的使用上面来, File
类的 list(FilenameFilter filter)
方法通过使用一个接口对象作为参数来实现过滤文件名的功能,具体的规则定义则是在 FilenameFilter
接口子类的方法 accept()
里面来实现的,这就是对 命令设计模式 的使用。
按道理,既然 list(FilenameFilter filter)
方法想要一个判断哪些文件需要被列出来的规则,那我们把规则传进去就行了,这个规则是一个代码块,但是目前的 java
并不支持向方法里面传入代码块的做法,所以 java
使用了 FilenameFilter
的 accept()
方法来封装判断规则,传入的 MyFilenameFilter
对象的作用其实是为了传入 accept()
方法的方法体,这个方法体的作用就是判断哪些文件名或者路径名符合规则, list(FilenameFilter filter)
的实现源码如下所示:
四. 源代码示例
github
地址: 点击查看
码云地址: 点击查看
欢迎关注人生设计师的微信公众账号
公众号ID:longjiazuoA以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
首席产品官2 从白领到金领
车马 / 机械工业出版社 / 79元
《首席产品官》共2册,旨在为产品新人成长为产品行家,产品白领成长为产品金领,最后成长为首席产品官(CPO)提供产品认知、能力体系、成长方法三个维度的全方位指导。 作者在互联网领域从业近20年,是中国早期的互联网产品经理,曾是周鸿祎旗下“3721”的产品经理,担任CPO和CEO多年。作者将自己多年来的产品经验体系化,锤炼出了“产品人的能力杠铃模型”(简称“杠铃模型”),简洁、直观、兼容性好、实......一起来看看 《首席产品官2 从白领到金领》 这本书的介绍吧!