来点实用的Java NIO(三)

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


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

现在,在我们的NIO2里面,则提供了更为轻巧方便的监控策略,下面散仙给出一些API,以供参考:

类或接口 方法名 作用
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() 发生的具体操作




下面,散仙给出示例源码:
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;
		  }
	  }
	}
}

运行,效果如下:
新建文件夹文件发生了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

截图如下:

来点实用的Java NIO(三)_第1张图片



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






你可能感兴趣的:(java,java,zookeeper,nio,文件监控)