Java IO文件过滤器对命令设计模式的使用

所属分类: 软件编程 / java 阅读数: 34
收藏 0 赞 0 分享

一. 点睛

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地址:点击查看

码云地址:点击查看

以上所述是小编给大家介绍的Java IO文件过滤器对命令设计模式的使用,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

更多精彩内容其他人还在看

Java concurrency之锁_动力节点Java学院整理

这篇文章主要为大家详细介绍了Java concurrency之锁的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java8新特性之StampedLock_动力节点Java学院整理

本文从synchronized、Lock到Java8新增的StampedLock进行对比分析,对Java8新特性之StampedLock相关知识感兴趣的朋友一起看看吧
收藏 0 赞 0 分享

Java8新特性之lambda的作用_动力节点Java学院整理

我们期待了很久lambda为java带来闭包的概念,但是如果我们不在集合中使用它的话,就损失了很大价值。现有接口迁移成为lambda风格的问题已经通过default methods解决了,在这篇文章将深入解析Java集合里面的批量数据操作解开lambda最强作用的神秘面纱。
收藏 0 赞 0 分享

Java8新特性之Base64详解_动力节点Java学院整理

这篇文章主要为大家详细介绍了Java8新特性之Base64的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java8新特性之JavaFX 8_动力节点Java学院整理

这篇文章主要介绍了Java8新特性之JavaFX 8的相关知识,非常不错,具有参考借鉴价值,需要的朋友参考下吧
收藏 0 赞 0 分享

将本地jar包安装进入maven仓库(实现方法)

下面小编就为大家带来一篇将本地jar包安装进入maven仓库(实现方法)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

浅谈Java finally语句到底是在return之前还是之后执行(必看篇)

下面小编就为大家带来一篇浅谈Java finally语句到底是在return之前还是之后执行(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

基于Java并发容器ConcurrentHashMap#put方法解析

下面小编就为大家带来一篇基于Java并发容器ConcurrentHashMap#put方法解析。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

详解Spring Boot Profiles 配置和使用

本篇文章主要介绍了详解Spring Boot Profiles 配置和使用,具有一定的参考价值,有兴趣的可以了解一下
收藏 0 赞 0 分享

详解Spring Boot 属性配置和使用

本篇文章主要介绍了详解Spring Boot 属性配置和使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享
查看更多