近段时间,对apache commons io的源码做了深入的了解,在此把一些见解与大家分享。
首先我选择了大部分框架还依赖的2.2版本而不是最新的2.4版本(2.5发行版还没有发布)进行源码的研读,今天就简介一下commons io的monitor部分。
Monitor部分较为简单,主要由一个线程处理类、观察者模式部分、监听适配器部分组成。
但我们应该先来了解一下monitor所依赖的以下commons-io类:
org.apache.commons.io.FileUtils
文件工具类,该类只使用了它的一个空文件数组常量。
有写文件、读文件、创建文件夹、复制文件/文件夹、删除文件/文件夹、从URL中获取文件、遍历后显示文件集结果、比较文件内容、修改文件最后修改时间、检查文件正确性,这些功能。
org.apache.commons.io.comparator.NameFileComparator
文件名文件比较器,该类就是用来判断观察主体的。
该类是文件全名称相关的比较器,所有关于文件全名称的比较器都需要处理大小写敏感问题,其构造方法通过多态实现指定大小写敏感类型的功能,而其默认是大小写敏感的;该类通过文件名进行比较,其名称由File.getName()方法获取,如果文件名相同则返回0。
org.apache.commons.io.IOCase
输入输出大小写敏感类
这个类专门处理流中的大小写问题。不同的文件系统对大小写敏感具有不同的规则。Windows是大小写不敏感的,Unix是大小写敏感的。IOCase可以自适应大小写敏感问题、基于当前系统的大小写敏感路径比较。
线程处理类:
org.apache.commons.io.monitor.FileAlterationMonitor
文件变更监视器类
这是一个线程实现类其内部代理了一个FileAlterationObserver对象集合,其功能是实现监控文件或文件夹的变更,包括增删改的变更,但当前类只实现线程。
观察者模式部分:
org.apache.commons.io.monitor.FileAlterationObserver
文件变更观察者类
该类使用了观察者模式监控指定文件或目录的变更,包括增删改的变更,与FileEntry配合使用。其监控的文件可以通过传递路径的方式来确定,该路径必须与File.getName()的返回值全匹配。FileEntry是观察主体,FileAlterationObserver是观察者。其checkAndNotify()方法观察主体是否有变化,并通过递归来观察文件夹内的所有文件,其使用FileEntry在内存中保存所监听的文件的状态,在调用checkAndNotify()的时候将FileEntry与实际的File对象进行对比,从而判断出是否有创建、编辑、删除的变化。一般会创建一个FileAlterationMonitor类对象通过后台线程进行定时检测。
org.apache.commons.io.monitor.FileEntry
文件观察主体类
一个观察者模式的主体,代表文件的类。其记录了文件或文件夹某个时刻的状态,当调用refresh()方法时其对文件进行同步,然后返回是否变更的结果。
监听适配器部分:
org.apache.commons.io.monitor.FileAlterationListener
文件变更监听器类
用于监听文件系统事件的接口,其可以监听文件夹的创建、文件夹的变更、文件夹的删除、文件的创建、文件的变更、文件的删除。
org.apache.commons.io.monitor.FileAlterationListenerAdaptor
文件变更监听适配器类
该类使用了适配器模式,其是适配FileAlterationListener类。需要子类进行具体实现。
ONE FOR IT是一个呆萌CTO打理的资讯读物,每天只为你准备一篇IT行业新鲜资讯。互联网的前沿,一篇就够了。(ID:OFI)