当前位置: 首页 > 编程笔记 >

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

傅元龙
2023-03-14
本文向大家介绍Java IO文件过滤器对命令设计模式的使用,包括了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地址:点击查看

码云地址:点击查看

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

 类似资料:
  • 问题内容: 任何人都可以用简单的命令模式示例来解释。我在互联网上指称,但我感到困惑。 问题答案: 在大多数情况下,命令是不可变的,并且包含封装了按需执行的单个动作的指令。您可能还具有一个RuntimeCommand,该RuntimeCommand在执行时接受指令,但是根据实现的不同,它会更深入地研究Strategy或Decorator模式。 我个人认为,注意命令的不变上下文非常重要,否则命令将成为

  • 2. 命令(Command) Intent 将命令封装成对象中,具有以下作用: 使用命令来参数化其它对象 将命令放入队列中进行排队 将命令的操作记录到日志中 支持可撤销的操作 Class Diagram Command:命令 Receiver:命令接收者,也就是命令真正的执行者 Invoker:通过它来调用命令 Client:可以设置命令与命令的接收者 Implementation 设计一个遥控器

  • 介绍 命令模式(Command)的定义是:用于将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及执行可撤销的操作。也就是说改模式旨在将函数的调用、请求和操作封装成一个单一的对象,然后对这个对象进行一系列的处理。此外,可以通过调用实现具体函数的对象来解耦命令对象与接收对象。 正文 我们来通过车辆购买程序来展示这个模式,首先定义车辆购买的具体操作类: $

  • 本文向大家介绍C++设计模式之命令模式,包括了C++设计模式之命令模式的使用技巧和注意事项,需要的朋友参考一下 前言 又要过年了,又是一个抢票季;从大学起,到现在工作,一直都是在外地,离家千里;以前买票,曾经也去火车站通宵排队买票;直到12306的腾空出现,在电脑前不停止的点着鼠标刷票,那个时候12306很是脆弱,抢一张票更是难上加难;现在好了,慢慢强大的12306,买票时出现了一个排队系统,先买

  • 问题内容: 我需要实施 其中ptrn是命令提示符样式模式,例如“ * 2010 * .txt” 我熟悉FilenameFilter类,但 由于String.matches()不接受此类模式而无法实现 。 谢谢! 问题答案: 所述接受的正则表达式 模式。 “ layman’s”变体的regex变体为。 因此,以下应该工作: 双反斜杠只是用来表示实际的反斜杠,因为反斜杠本身是Java中的转义字符。 另

  • 主要内容:实现,Person.java,Criteria.java,CriteriaMale.java,CriteriaFemale.java,CriteriaSingle.java,AndCriteria.java,OrCriteria.java,CriteriaPatternDemo.java过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型