前天混迹于freenode ##java的时候听到omry提及jnotify,一个使用JNI通过本地库来监视文件系统变化的实用库,支持win32系统和Linux(需要INotify),而这位omry也正是jnotify项目的admin。我觉得这样一个库很有用,因为平时能做的就是创建线程来监视,而通过JNI借由操作系统的支持,就方便的多,而且性能也稍微好一些。

jnotify的api简单到不能再简单了,一般只要一个类的两个静态方法再实现一个接口就可以了,然而也正是这样一种让人感觉不像Java而像是C风格的使用方式让我和omry争论了半天,我还是希望一些更”现代”的方式,也更容易让我整合进Spring里面。

另外就是我希望能够在jnotify这个层次上区分开普通文件目录,而不是让客户代码自己来判断。这一说法立刻引来若干人的指教:目录也是文件。也许他们觉得我是被Windows养大的孩子吧,哈哈。这年头如果有开发人员不知道目录也是文件,我还是会意料之中的惊讶一下。无论从学术概念还是绝大部分的文件系统实现来看,目录确实也被抽象为文件了,但是在实际使用过程中,我的经验–实在是谈不上是经验的经验–是普通文件目录大部分时间内还是被区别对待的,比如我们从来不会打开一个目录去加载目录的内容,而会加载一个XML文件的配置内容。开发人员通过创建一个File对象自然可以判断一个文件是普通文件还是目录,但是一是也许会创建很多临时对象,二是因为大部分时间里普通文件目录是区别对待的,所以不得不用if-else来分开两种迥异的操作,如果懂得extract method还好,否则可能会有大段的if-else块,影响代码阅读,如果可以在实现接口时借由参数得知这个文件到底是普通文件还是目录,甚至处理普通文件目录的方法根本就是被分开的,那至少我的感觉会好一些,当然,同时接口和接口里的方法数量也会增加很多,这也许是omry这样的从业10余年的老黑客看不习惯的吧:^) 结果,我把我wrap过的jnotify(根本没改动jnotify的代码,只是在外面增加一层)的代码发给了omry,他说,nice code,但是暂时还不会把它们加到jnotify里。DIANG~

测试0.7版的时候发现一个bug,会导致JVM退出时的核心线程DestroyJavaVM停止响应,我猜测应该是JNI本地代码的问题,那个时候main thread的exit()都执行完事儿了。不知道omry怎么解决的,0.8版jnotify瞬间release,我还没测试…

这个故事告诉我们,不知道目录也是文件还好说,但是如果在表达”目录”这个概念时说出了”文件夹“、”folder“之类的词,那是值得被一而再再而三地猛烈鄙视的。

Technorati :