来点实用的Java NIO(三)_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 来点实用的Java NIO(三)

来点实用的Java NIO(三)

 2013/11/26 21:29:04  qindongliang1922  程序员俱乐部  我要评论(0)
  • 摘要:继昨天的NIO文件夹遍历,散仙今天要分享另外两个基于NIO的比较实用的知识,第一个分享的是使用NIO对操作系统的文件进行监控,第二个要分享的是关于操作系统的文件锁,(散仙:这个会放在下一篇博客中)。在Java以前的版本中,如果程序想要监控文件的变化,则可以采用启动一条后台线程,定时去扫描某个文件夹,或某个文件夹下的文件,如果扫描过程中发现此次的遍历结果与上次的结果不同,则认为此文件发生了变化,当然你还得考虑怎么临时存储上一次文件的改动情况,这种方式不仅,十分繁琐而且性能也不好。现在
  • 标签:Java 实用
继昨天的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
  • 查看图片附件
上一篇: java 使用POI操作Excel----基本使用 下一篇: 没有下一篇了!
发表评论
用户名: 匿名