近段时间,对apache commons io的源码做了深入的了解,在此把一些见解与大家分享。
首先我选择了大部分框架还依赖的2.2版本而不是最新的2.4版本(2.5发行版还没有发布)进行源码的研读,今天就简介一下commons io的comparator部分。
我们先来看一下Comparator部分类、接口之间的继承、实现以及依赖关系图。
commons-io提供了十几种比较器,大体我们将它们分为以下三部分:通用部分、基于File属性比较部分、基于File全名称比较部分。
但我们应该先来了解一下comparator所依赖的一下commons-io类:
org.apache.commons.io.IOCase
输入输出大小写敏感类
这个类专门处理流中的大小写问题。不同的文件系统对大小写敏感具有不同的规则。Windows是大小写不敏感的,Unix是大小写敏感的。IOCase可以自适应大小写敏感问题、基于当前系统的大小写敏感路径比较。
org.apache.commons.io.FileUtils
文件工具类
有写文件、读文件、创建文件夹、复制文件/文件夹、删除文件/文件夹、从URL中获取文件、遍历后显示文件集结果、比较文件内容、修改文件最后修改时间、检查文件正确性,这些功能。
org.apache.Commons.io.FilenameUtils
文件名工具类
文件命名工具类,以构造同时适用于unix与windows的文件路径。
其主要实现了处理逻辑路径返回一个最简路径,即把..后又打开又..等的情况处理掉。
路径连接,即把后一个逻辑路径与前一个逻辑路径的连接起来。
判断两个路径是否是包含关系路径转换,unix与windows互换比较路径是否相同.
根据commons io的官方最佳实践,推荐我们尽量使用java.io.File进行文件名的处理,而不是使用org.apache.commons.io.FilenameUtils类。
通用部分:
org.apache.commons.io.comparator.AbstractFileComparator
抽象文件比较器
该超类实现了Comparator接口,根据Java官方文档的说明,Comparator接口的实现类定义了一个集合排序的比较依据。因此AbstractFileComparator的所有子类应该都是用于文件集合排序操作的。AbstractFileComparator抽象出sort()方法以方便其子类实现。sort()根据文件集合类型的不同(Array数组类型或Collection集合类型)多态采用了arrays.sort以及Collections.sort来进行排序。
org.apache.commons.io.comparator.ReverseComparator
反转比较器
反转比较器,该类的访问权限为包访问权限,其代理其他的Comparator实现类,在比较的时候将其file1参数和file2参数相反传递,以实现反转比较。开发人员不能直接使用该类。
org.apache.commons.io.comparator.CompositeFileComparator
复合文件比较器
该类是复合文件比较器类,其内部有一个数组代理了多个文件比较器,使用该比较器进行比较的两个文件必须通过所有被代理的比较器且都相等时才相等。当结果不相等时,其结果为最先出现不相等的那个比较器的结果。
基于File属性比较部分:
org.apache.commons.io.comparator.DefaultFileComparator
默认方法文件比较器
使用File.compareTo()进行比较的默认文件比较类
org.apache.commons.io.comparator.DirectoryFileComparator
文件夹文件比较器
只要两个文件不是同时是文件夹或同时是文件都返回正整数或负整数
org.apache.commons.io.comparator.LastModifiedFileComparator
最后修改时间文件比较器
该类通过获取两个文件的最后修改时间相减,如果为0则相等。
org.apache.commons.io.comparator.SizeFileComparator
文件大小文件比较器
该类比较文件的大小或文件夹的大小,可以通过布尔型参数设置如果比较的是文件夹是否需要计算文件夹内文件大小的总和来进行比较。默认不计算总和。但比较对象是文件夹时,调用FileUtils.sizeOfDirectory(File)方法获取文件夹大小进行比较。
基于File全名称比较部分:
org.apache.commons.io.comparator.ExtensionFileComparator
后缀文件比较器
该类是文件全名称相关的比较器,所有关于文件全名称的比较器都需要处理大小写敏感问题,其构造方法通过多态实现指定大小写敏感类型的功能,而其默认是大小写敏感的;该类通过文件后缀进行比较,如果文件后缀相同则返回0。
org.apache.commons.io.comparator.NameFileComparator
文件名文件比较器
该类是文件全名称相关的比较器,所有关于文件全名称的比较器都需要处理大小写敏感问题,其构造方法通过多态实现指定大小写敏感类型的功能,而其默认是大小写敏感的;该类通过文件名进行比较,其名称由File.getName()方法获取,如果文件名相同则返回0。
org.apache.commons.io.comparator.PathFileComparator
文件路径文件比较器
该类是文件全名称相关的比较器,所有关于文件全名称的比较器都需要处理大小写敏感问题,其构造方法通过多态实现指定大小写敏感类型的功能,而其默认是大小写敏感的;该类通过文件路径进行比较,如果文件路径相同则返回0。
ONE FOR IT是一个呆萌CTO打理的资讯读物,每天只为你准备一篇IT行业新鲜资讯。互联网的前沿,一篇就够了。(ID:OFI)