JDK7提供了一系列的API用来监控文件目录的变化,该API提供了一种监视机制,可以针对事件(如创建、修改和删除)监视特定文件或目录的状态。
但是该API并不保证监视事件是采用推送模型,大部分情况下会使用轮询机制。监视服务也依赖于系统,所以无法利用这种服务构建真正可移植的应用。
因为 WatchService 本身并不支持递归 Watch,Watch一个文件夹只能Watch一层,子文件夹里面变动并不能Watch到,所有这里使用 FileVisitor 遍历所有目录注册 Watch。
文本在Mac下测试,如果监控/
根目录的话(包含可访问的所有子目录),遍历完成大概花了5分钟左右,因为是采用轮训的方式,监控效率并不高,创建一个文件半天看不到效果。
而且资源消耗也不少,通过jcmd <pid> GC.heap_dump <filepath>
拉出堆栈信息,sun.nio.fs.PollingWatchService$PollingWatchKey
该类就占用了300多兆的空间,sun.nio.fs.UnixPath
和sun.nio.fs.PollingWatchService$CacheEntry
有100多万个实例,占了大部分的空间,所有还是不建议监控过多的文件。
直接上代码,拷贝运行,查看效果
在当前目录下,创建文件夹、创建文件、修改文件、删除文件,查看输出。
1 |
|