`
qindongliang1922
  • 浏览: 2148929 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:116363
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:124630
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:58533
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:70407
社区版块
存档分类
最新评论

来点实用的Java NIO(三)

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


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

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

类或接口方法名作用
Pathregister(WatchService watcher, WatchEvent.Kind<?>... events)用watcher监听该path代表的目录下的变化,events参数指定监听那些类型的时间
WatchServiceclose()关闭监听服务
WatchServicepoll()获取下一个WatchKey,如果没有则立即返回null
WatchServicepoll(long timeout, TimeUnit unit)定时访问下一个WatchKey
WatchServicetake()如果没有WatchKey发生,就一直处于监听状态
WatchEventcontext()返回监听的上下文
WatchEventcount()该事件发生的次数
WatchEventkind()发生的具体操作




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

截图如下:





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






  • 大小: 43.4 KB
3
0
分享到:
评论
12 楼 欧阳鹏 2015-05-14  
楼主我想问下,为什么我按照你的脚本执行时候,对文件的更新操作,ENTRY_MODIFY事件此事件发生的次数: 2
让人好费解
11 楼 heipacker 2014-07-08  
jdk版本?专业点啊楼主
10 楼 qindongliang1922 2014-04-18  
jack2code1 写道
求教:如果监控的是一个远程网络位置(映射远程主机的目录到本地磁盘,例如:H:\),此时无法注册监控事件。

远程的应该是软连接的形式吧
9 楼 jack2code1 2014-04-18  
求教:如果监控的是一个远程网络位置(映射远程主机的目录到本地磁盘,例如:H:\),此时无法注册监控事件。
8 楼 jack2code1 2014-04-18  
Exception in thread "Thread-0" java.lang.AssertionError: Should not get here
at sun.nio.fs.WindowsFileAttributes.volSerialNumber(WindowsFileAttributes.java:387)
at sun.nio.fs.WindowsWatchService$Poller.implRegister(WindowsWatchService.java:361)
at sun.nio.fs.AbstractPoller.processRequests(AbstractPoller.java:260)
at sun.nio.fs.WindowsWatchService$Poller.run(WindowsWatchService.java:531)
at java.lang.Thread.run(Thread.java:722)
7 楼 qindongliang1922 2013-11-28  
pi88dian88 写道
学到了很不错的东西

加油!
6 楼 pi88dian88 2013-11-28  
学到了很不错的东西
5 楼 manong_java 2013-11-27  
还好 不复杂,最近也把java并发包的部分 弄进去了 不过还不熟练 凑合着用吧 哈哈
4 楼 qindongliang1922 2013-11-27  
manong_java 写道
qindongliang1922 写道
manong_java 写道
哈哈 这个功能 在项目里已经用了

你们用来做什么的啊

FTP 文件监控

那不错啊,复杂不
3 楼 manong_java 2013-11-27  
qindongliang1922 写道
manong_java 写道
哈哈 这个功能 在项目里已经用了

你们用来做什么的啊

FTP 文件监控
2 楼 qindongliang1922 2013-11-27  
manong_java 写道
哈哈 这个功能 在项目里已经用了

你们用来做什么的啊
1 楼 manong_java 2013-11-27  
哈哈 这个功能 在项目里已经用了

相关推荐

    JavaNIO chm帮助文档

    Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六) Selector Java NIO系列教程(七) FileChannel Java NIO系列教程(八) ...

    java NIO和java并发编程的书籍

    java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...

    Java NIO英文高清原版

    Java NIO英文高清原版

    Java NIO 中文 Java NIO 中文 Java NIO 中文文档

    Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...

    java nio 包读取超大数据文件

    Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据...

    java nio 实现socket

    java nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socket

    java NIO 中文版

    讲解了 JavaIO 与 JAVA NIO区别,JAVA NIO设计理念,以及JDK中java NIO中语法的使用

    java NIO 视频教程

    Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。 Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,...

    java nio中文版

    java NIO是 java New IO 的简称,在 jdk1.4 里提供的新 api 。 Sun 官方标榜的特性如下: – 为所有的原始类型提供 (Buffer) 缓存支持。 – 字符集编码解码解决方案。 – Channel :一个新的原始 I/O 抽象。 – 支持...

    java NIO.zip

    java NIO.zip

    Java Nio selector例程

    java侧起server(NioUdpServer1.java),基于Java Nio的selector 阻塞等候,一个android app(NioUdpClient1文件夹)和一个java程序(UI.java)作为两个client分别向该server发数据,server收到后分别打印收到的消息...

    java nio 读文件

    java nio 读文件,java nio 读文件

    java基于NIO实现Reactor模型源码.zip

    java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现...

    JAVA NIO 学习资料

    JAVA NIO学习资料JAVA NIO学习资料

    java NIO技巧及原理

    java NIO技巧及原理解析,java IO原理,NIO框架分析,性能比较

    Java NIO测试示例

    Java NIO测试示例

    JavaNIO.pdf

    JavaNIO.pdf

    Java NIO.pdf

    java nio编程 非阻塞模式的通信 电子书 带目录标签

    Java NIO系列教程(一) Java NIO 概述

    Java NIO系列教程(一) Java NIO 概述

    java nio proraming pdf

    java.nio (NIO stands for non-blocking I/O) is a collection of Java programming language APIs that offer features for intensive I/O operations. It was introduced with the J2SE 1.4 release of Java by ...

Global site tag (gtag.js) - Google Analytics