Java 7 NIO.2 实现文件系统监视
现在我们对需要考虑的问题进行以下概括:
- 在补丁或者升级安装测试中,哪些文件发生了变化(新增,修改或删除),如何得到一个文件变更的文本清单。如何把这些变更文件复制到一个独立的备份目录,以便在不同的每日构建版本间进行比对。如果上一个构建升级测试时,软件功能正常,当前构建升级之后工作不正常,就需要探究发生变更的文件有什么区别。通过备份目录的比对,可以很方便的找出那些差异。
每日构建的安装版本,往往在打包的时候,缺少一些文件,类库等等,在优化升级打包流程的时候更容易出现这些问题。Java 7 NIO.2 新特性可以帮助我们监视安装过程中的文件系统变化,从而解决这些问题。
为实现文件变更监视服务,我们需要完成以下工作:
- ?
- 创建 WatchService 的一个实例变量 "watcher"。 使用 watcher 注册每一个想要监视的目录。注册目录到监视服务时,需要指定想要接收文件更改通知的事件类型。注册目录会返回一个 WatchKey 实例 key。 执行一个无限循环来监控要到来的事件。当一个事件发生时,对实例 key 发出信号通知并且将它放到 watcher 的队列中。 从 watcher 的队列中重新得到 key 实例。Key 实例包含发生变更的文件名。从 key 实例中得到挂起的事件,然后根据需要对这些事件进行处理。 重置 key 实例并重新开始监控事件。监控完毕,关掉监视服务。
现在来探讨如何把 Java 7 的 NIO.2 新特性用于安装测试。需要完成的任务有以下几点:
1. 如何利用文件监视新特性生成文件变更清单:
以安装测试的一个实际例子来演示如何使用文件监视新特性生成文件变更清单。下文会详细解释如何监视安装过程中文件系统的变化,监视安装完成之后会得到文件变更清单。
2. 备份变更的文件并进行比对:
利用 Java 7 中 File I/O API 读取文件变更清单,然后把新增的、修改过的等文件复制到一个新的目录下进行备份。备份之后我们可以和基准版本进行比对,来评估安装目录文件系统差异。
?
上文源码中,cast(Event event) 方法用来避免如下异常:
?
现在我们已经知道需要复制的源文件,下面来看如何进行复制备份。首先得到源文件相对于监视目录的相对路径 relativePath。再得到备份目录 backDir,该目录由监视目录 +“_backup”+ 复制时时间戳组成。变更文件会被复制到这个备份目录下。然后根据 relativePath 和 backDir 目录,得到目标文件的路径。如果目标文件的父目录不存在,程序会自动创建父目录,然后再执行复制备份操作。如果目标文件或者文件夹已经存在,跳过复制,不需要再次操作。在例子中,如果源文件为 C:\Modeler\14.2\Demos\,那么目标文件路径为 C:\Modeler\14.2_backup_20110612_14_05 \Demos\。代码见清单 6。
清单 6. 复制操作方法
?
总结
通过上面的介绍,我们了解到如何基于 Java 7 新特性实现对安装过程进行监视,通过评估安装目录的差异,尽早发现软件质量问题。