继昨天的NIO文件夹遍历,散仙今天要分享另外两个基于NIO的比较实用的知识,第一个分享的是使用NIO对操作系统的文件进行监控,第二个要分享的是关于操作系统的文件锁,(散仙:这个会放在下一篇博客中)。
在Java以前的版本中,如果程序想要监控文件的变化,则可以采用启动一条后台线程,定时去扫描某个文件夹,或某个文件夹下的文件,如果扫描过程中发现此次的遍历结果与上次的结果不同,则认为此文件发生了变化,当然你还得考虑怎么临时存储上一次文件的改动情况,这种方式不仅,十分繁琐而且性能也不好。
现在,在我们的NIO2里面,则提供了更为轻巧方便的监控策略,下面散仙给出一些API,以供参考:
类或接口方法名作用Pathregister(WatchService watcher, WatchEvent.Kind<?>... events)用watcher监听该path代表的目录下的变化,events参数指定监听那些类型的时间WatchServiceclose()关闭监听服务WatchServicepoll()获取下一个WatchKey,如果没有则立即返回nullWatchServicepoll(long timeout, TimeUnit unit)定时访问下一个WatchKeyWatchServicetake()如果没有WatchKey发生,就一直处于监听状态WatchEventcontext()返回监听的上下文WatchEventcount()该事件发生的次数WatchEventkind()发生的具体操作
下面,散仙给出示例源码:
class="java" name="code">package com.watchservice;
import java.nio.file.Filesystems.html" target="_blank">Systems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
/***
*
* @author 秦东亮
* 实时监控某个目录
*
* **/
public class MyWatchService {
public static void main(String[] args)throws Exception {
//获取当前文件系统的WatchService监控对象
WatchService watchService=FileSystems.getDefault().newWatchService();
//监听的事件类型,有创建,删除,以及修改
Paths.get("E:\\测试java监听").register(watchService, StandardWatchEventKinds.ENTRY_CREATE,StandardWatchEventKinds.ENTRY_DELETE,StandardWatchEventKinds.ENTRY_MODIFY,StandardWatchEventKinds.OVERFLOW);
while(true){
//获取下一个文件变化事件
WatchKey key=watchService.take();
for(WatchEvent<?> event:key.pollEvents()){
System.out.println(event.context()+"文件发生了"+event.kind()+"事件"+"此事件发生的次数: "+event.count());
}
//重设WatchKey
boolean valid=key.reset();
//监听失败,退出监听
if(!valid){
break;
}
}
}
}
运行,效果如下:
新建文件夹文件发生了ENTRY_CREATE事件此事件发生的次数: 1
新建 Microsoft Excel 工作表.xlsx文件发生了ENTRY_CREATE事件此事件发生的次数: 1
新建 Microsoft Excel 工作表.xlsx文件发生了ENTRY_MODIFY事件此事件发生的次数: 1
新建 Microsoft Excel 工作表.xlsx文件发生了ENTRY_MODIFY事件此事件发生的次数: 1
新建 Microsoft Excel 工作表.xlsx文件发生了ENTRY_MODIFY事件此事件发生的次数: 1
新建 Microsoft Excel 工作表 (2).xlsx文件发生了ENTRY_CREATE事件此事件发生的次数: 1
新建 Microsoft Excel 工作表 (2).xlsx文件发生了ENTRY_MODIFY事件此事件发生的次数: 1
新建 Microsoft Excel 工作表 (2).xlsx文件发生了ENTRY_MODIFY事件此事件发生的次数: 1
新建 Microsoft Excel 工作表 (2).xlsx文件发生了ENTRY_MODIFY事件此事件发生的次数: 1
新建 Microsoft Excel 工作表 (2).xlsx文件发生了ENTRY_DELETE事件此事件发生的次数: 1
截图如下:
至此,我们的一个小型监控项目就完成了,这个技术在很多时候,都非常有用,例如一些主从架构的数据同步的场景,Master数据状态改变了,然后就可以立即同步到Slave里,这其实就跟文件系统监控的原理差不多。文件系统的监控不仅要求可靠性高,而且还得简单,好用,说到这里,不得不提下,我们分布式环境下经常用到的一个集群协作服务Zookeeper,当然zookeeper的实现原理,比我们这个小技术要复杂多了,其中的一些leader选举算法,状态一致算法都是非常复杂的,不过zookeeper的对外API提供的非常短小简单,它的安装部署也是非常容易的,有兴趣的朋友可以深入的研究一下。
- 大小: 43.4 KB