您的位置:首页 > 运维架构 > Apache

apache commons io 2.2(二)Filter部分

2016-02-07 01:57 501 查看
近段时间,对apache commons io的源码做了深入的了解,在此把一些见解与大家分享。

首先我选择了大部分框架还依赖的2.2版本而不是最新的2.4版本(2.5发行版还没有发布)进行源码的研读,今天就简介一下commons io的filter部分。

我们先来看一下filter部分类、接口之间的继承、实现以及依赖关系图,filter部分实在是有点儿错综复杂呀。



commons-io提供了二十几种过滤器,大体我们将它们分为以下四部分:通用部分、基于逻辑运算符过滤部分、基于File属性过滤部分、基于File全名称过滤部分。

但我们应该先来了解一下filter所依赖的以下commons-io类:

org.apache.Commons.io.FilenameUtils

文件名工具类

文件命名工具类,以构造同时适用于unix与windows的文件路径。

其主要实现了处理逻辑路径返回一个最简路径,即把..后又打开又..等的情况处理掉。

路径连接,即把后一个逻辑路径与前一个逻辑路径的连接起来。

判断两个路径是否是包含关系路径转换,unix与windows互换比较路径是否相同.

根据commons io的官方最佳实践,推荐我们尽量使用java.io.File进行文件名的处理,而不是使用org.apache.commons.io.FilenameUtils类。

org.apache.commons.io.IOCase

输入输出大小写敏感类

这个类专门处理流中的大小写问题。不同的文件系统对大小写敏感具有不同的规则。Windows是大小写不敏感的,Unix是大小写敏感的。IOCase可以自适应大小写敏感问题、基于当前系统的大小写敏感路径比较。

org.apache.commons.io.FileUtils

文件工具类

有写文件、读文件、创建文件夹、复制文件/文件夹、删除文件/文件夹、从URL中获取文件、遍历后显示文件集结果、比较文件内容、修改文件最后修改时间、检查文件正确性,这些功能。

org.apache.commons.io.IOUtils

通用输入输出流的便捷操作工具类,有许多静态的工具方法,主要有关闭流、读取流、写入流、两流间复制、两流内容是否相等。

字节转字符和字符转字节的方法,鼓励使用给定字符集编码的方法进行操作,这样对环境迁移如开发环境到运行环境能获得更好的支持。

该类中的方法都不会对流进行清洗或关闭,这样就不会影响调用处的使用。

我们可以发现过滤器对输入输出流的使用比比较器更加深入,其过滤的依据包含了关于内容的部分,这也是用到了IOUtils类的一个原因。

通用部分:

org.apache.commons.io.filfilter.IOFileFilter

该接口继承了java.io.FileFilter以及java.io.FilenameFilter两个接口。其用意是实现一个可通过文件名及文件路径进行过滤的文件流过滤器接口。

org.apache.commons.io.filefilter.AbstractFileFilter

这个类实现了接口org.apache.commons.io.filefilter.IOFileFilter的两个accept方法。它的实现方法为两个accept方法相互调用,这样方便了子类在复写其中一个accept方法后即已完成另一个方法的效果。因此其子类必须复写两个accept方法中的其中一个,不然将陷入循环调用中。

基于逻辑运算符过滤部分:

org.apache.commons.io.filefilter.ConditionalFileFilter

该接口类似一个集合接口,其提供的方法维护一个IOFileFilter的集合。这个集合组成一个离散数学逻辑运算公式。

org.apache.commons.io.filefilter.OrFileFilter

该过滤器代理一个IOFileFilter集合,开发人员可对集合做增删改操作。在过滤时只要其中一个IOFileFilter返回true则过滤该文件。

org.apache.commons.io.filefilter.AndFileFilter

该过滤器代理一个IOFileFilter集合,开发人员可对集合做增删改操作。在过滤时需要集合中的每个IOFileFilter都返回true才返回true。

org.apache.commons.io.filefilter.NotFileFilter

该过滤器代理其他的过滤器,在过滤时调用其他过滤器进行过滤,但结果取反。

org.apache.commons.io.filefilter.FalseFileFilter

该过滤器无论传入什么都将返回false即都不能通过。比较特别的是该类有两个自身单例模式成员变量,一个叫INSTANCE,另一个比较新的叫FALSE,我们可以看出比较新的单例变量更易于理解。

org.apache.commons.io.filefilter.TrueFileFilter

该过滤器无论传入什么都将返回true即都不能通过。比较特别的是该类有两个自身单例模式成员变量,一个叫INSTANCE,另一个比较新的叫TRUE,我们可以看出比较新的单例变量更易于理解。

基于File属性过滤部分:

org.apache.commons.io.filefilter.DelegateFileFilter

该类代理了两个filefilter,一个是FilenameFilter,另一个是FileFilter。并在过滤时调用其默认方法。

org.apache.commons.io.filefilter.FileFileFilter

该类用于过滤文件,它将会让文件通过,把文件夹给挡掉。

org.apache.commons.io.filefilter.DirectoryFileFilter

该类用于过滤出文件夹,它将会让文件夹通过,把文件给挡掉。比较特别的是该类有两个自身单例模式成员变量,一个叫INSTANCE,另一个比较新的叫DIRECTORY,我们可以看出比较新的单例变量更易于理解。

org.apache.commons.io.filefilter.AgeFileFilter

该类通过一个给定的时间来过滤出该时间以前或以后的文件来,默认取以前。该类的构造方法提供了三种确定时间的方法,分别是长整型好描述、Date类型以及File类型,当传入File类型对象时取该对象的最后修改时间。

org.apache.commons.io.filefilter.SizeFileFilter

该类过滤出小于或大于指定文件大小的文件,可以通过布尔型参数设置比较的是大于还是小于,默认为大于。

org.apache.commons.io.filefilter.MagicNumberFileFilter

由于二进制文件后缀基本相同,都是dat,且文件内容都是1和0,因此软件在读取二进制文件时,为了识别该文件是否可操作,就判断文件开头的指定字节,这些字节被成为魔术数字。例如Java的魔术数字则为CAFEBABE。而该过滤器则过滤出拥有指定魔术数字的文件。

org.apache.commons.io.filefilter.EmptyFileFilter

该类通过用于过滤出为空或不为空的文件或文件夹,当过滤文件夹时,通过判断文件夹的文件数来过滤,当过滤文件时,通过判断文件长度来过滤。

org.apache.commons.io.filefilter.HiddenFileFilter

该类通过调用File类的isHidden方法来进行过滤,用于过滤隐藏或非隐藏文件。

org.apache.commons.io.filefilter.CanReadFileFilter

该类通过调用File类的canRead方法来进行过滤,用于过滤只读或非只读文件。

org.apache.commons.io.filefilter.CanWriteFileFilter

该类通过调用File类的canWrite方法来进行过滤,用于过滤只写或非只写文件。

基于File全名称过滤部分:

org.apache.commons.io.filefilter.NameFileFilter

该类是文件全名称相关的过滤器,所有关于文件全名称的过滤器都需要处理大小写敏感问题,其构造方法通过多态实现指定大小写敏感类型的功能,而其默认是大小写敏感的;该类通过文件名进行过滤,只用文件名相等的才能通过。

org.apache.commons.io.filefilter.PrefixFileFilter

该类是文件全名称相关的过滤器,所有关于文件全名称的过滤器都需要处理大小写敏感问题,其构造方法通过多态实现指定大小写敏感类型的功能,而其默认是大小写敏感的;该类通过文件前缀进行过滤,只用文件名前缀相等的才能通过。

org.apache.commons.io.filefilter.RegexFileFilter

该类是文件全名称相关的过滤器,所有关于文件全名称的过滤器都需要处理大小写敏感问题,其构造方法通过多态实现指定大小写敏感类型的功能,而其默认是大小写敏感的;该类允许开发者使用正则表达式对文件名进行过滤。

org.apache.commons.io.filefilter.SuffixFileFilter

该类是文件全名称相关的过滤器,所有关于文件全名称的过滤器都需要处理大小写敏感问题,其构造方法通过多态实现指定大小写敏感类型的功能,而其默认是大小写敏感的;

该类通过文件后缀进行过滤,只用文件名后缀相等的才能通过。

org.apache.commons.io.filefilter.WildcardFileFilter

该类是文件全名称相关的过滤器,所有关于文件全名称的过滤器都需要处理大小写敏感问题,其构造方法通过多态实现指定大小写敏感类型的功能,而其默认是大小写敏感的;该过滤器使用通配符对文件名进行过滤,个人认为与正则表达式过滤器有所重复。

org.apache.commons.io.filefilter.WildcardFilter

由于该过滤器未处理大小写敏感问题,所以已经被WildcardFileFilter所取代,避免使用该类。

此外commons io为了开发人员能够更简便地使用过滤器还专门开发了一个过滤器工具类:

org.apache.commons.io.filefilter.FileFilterUtils

该类通过调用其他的类实现逻辑运算部分、大多数File属性部分、大多数File全名称部分的方法,这样我们就无需去实例化具体的过滤器了。首先对于待过滤的文件集合提供了两种输入方式,分别为数组和迭代器,而过滤后的文件列表也可选择返回数组或List或Set来返回。此外它还提供了包括文件前缀过滤、文件后缀过滤、文件名过滤。以上三种过滤都可传参确定大小写是否敏感,而后还有文件夹过滤、文件过滤,另外包括与关系过滤和或关系过滤、非关系过滤、True过滤、False过滤进行过滤条件的组装,并通过toList方法将所有条件返回回来。然后还有集合过滤、创建时长过滤、文件大小过滤、特定字节过滤、svn文件过滤、cvs文件过滤。

最后commons io还提供了我们最最常用的文件遍历功能,其具体是由以下类实现的,配合过滤器将得到开发人员所希望的遍历效果。

org.apache.commons.io.DirectoryWalker

这是一个抽象类(但其实大部分方法都不是抽象方法)。其作用是遍历文件,并设置各种回调函数供子类在遍历文件时进行响应处理。可以实现遍历文件夹筛选出所需文件及文件夹的功能,比如可以继承此类来实现删除所有“.svn”后缀的文件。

通过调用它的无参构造方法可访问指定文件树。

第二个构造方法是接收一个FileFilter对象来对遍历的文件树进行过滤。

第三个构造方法是接收两个FileFilter对象,第一个对象用于过滤文件夹,第二个对象用户过滤文件

并且还可以通过DirectoryWalker.CancelException来实现文件遍历操作的取消。

在多线程中,我们从另一个线程试图关闭原线程的文件遍历操作可以使用handleCancelled方法。

也可以在逻辑内部调用handleCancelled方法进行取消

DirectoryWalker(FileFilter filter, int depthLimit)

如果filter为null则表示遍历的文件及文件夹都将被访问到

walk函数使用递归进行遍历,每次递归开始都将判断是否取消以判断是否进行该此访问。

ONE FOR IT是一个呆萌CTO打理的资讯读物,每天只为你准备一篇IT行业新鲜资讯。互联网的前沿,一篇就够了。(ID:OFI)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: