来点实用的Java NIO(三)

[b][color=green][size=large]继昨天的NIO文件夹遍历,散仙今天要分享另外两个基于NIO的比较实用的知识,第一个分享的是使用NIO对操作系统的文件进行监控,第二个要分享的是关于操作系统的文件锁,(散仙:这个会放在下一篇博客中)。
[/size][/color][/b]

[b][color=olive][size=x-large]在Java以前的版本中,如果程序想要监控文件的变化,则可以采用启动一条后台线程,定时去扫描某个文件夹,或某个文件夹下的文件,如果扫描过程中发现此次的遍历结果与上次的结果不同,则认为此文件发生了变化,当然你还得考虑怎么临时存储上一次文件的改动情况,这种方式不仅,十分繁琐而且性能也不好。[/size][/color][/b]

[b][color=olive][size=large]现在,在我们的NIO2里面,则提供了更为轻巧方便的监控策略,下面散仙给出一些API,以供参考:[/size][/color][/b]
[b][size=large]
[table]
|类或接口|方法名|作用
|Path|register(WatchService watcher, WatchEvent.Kind<?>... events)|用watcher监听该path代表的目录下的变化,events参数指定监听那些类型的时间
|WatchService|close()|关闭监听服务
|WatchService|poll()|获取下一个WatchKey,如果没有则立即返回null
|WatchService|poll(long timeout, TimeUnit unit)|定时访问下一个WatchKey
|WatchService|take()|如果没有WatchKey发生,就一直处于监听状态
|WatchEvent|context()|返回监听的上下文
|WatchEvent|count()|该事件发生的次数
|WatchEvent|kind()|发生的具体操作

[/table]
[/size]
[/b]

[b][color=olive][size=large]下面,散仙给出示例源码:[/size][/color][/b]
package com.watchservice;

import java.nio.file.FileSystems;
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;
}
}
}
}

[b][color=green][size=large]运行,效果如下:[/size][/color][/b]
新建文件夹文件发生了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

[b][color=green][size=large]截图如下:[/size][/color][/b]

[img]http://dl2.iteye.com/upload/attachment/0091/5775/a99cdcb4-44f9-377a-b33c-a8dc86e45f0d.jpg[/img]

[b][color=green][size=x-large]

至此,我们的一个小型监控项目就完成了,这个技术在很多时候,都非常有用,例如一些主从架构的数据同步的场景,Master数据状态改变了,然后就可以立即同步到Slave里,这其实就跟文件系统监控的原理差不多。文件系统的监控不仅要求可靠性高,而且还得简单,好用,说到这里,不得不提下,我们分布式环境下经常用到的一个集群协作服务Zookeeper,当然zookeeper的实现原理,比我们这个小技术要复杂多了,其中的一些leader选举算法,状态一致算法都是非常复杂的,不过zookeeper的对外API提供的非常短小简单,它的安装部署也是非常容易的,有兴趣的朋友可以深入的研究一下。[/size][/color][/b]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值