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

来点实用的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.zip

    Java NIO,全称为Non-...总的来说,Java NIO提供了比传统I/O更灵活、更高效的数据传输机制,尤其适用于需要处理大量并发连接的网络应用,如服务器端的开发。通过合理利用NIO的特性,可以构建出高性能、低延迟的系统。

    Java NIO英文高清原版

    总的来说,Java NIO是一个强大的工具,对于需要处理大量并发连接和数据交换的应用来说,它提供了显著的性能提升。Netty则是NIO的一个高级封装,它进一步降低了使用NIO的复杂性,提高了开发效率。学习和理解Java NIO...

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

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

    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 NIO中,处理超大数据文件的关键在于合理利用内存映射文件(Memory-Mapped Files)来提高读取效率。内存映射文件是一种将文件内容直接映射到内存中的技术,使得对文件...

    java NIO技巧及原理

    Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(IO)相比,提供了更加高效的数据传输方式。在Java NIO中,"新"主要体现在非阻塞和多路复用这两个特性上,这使得NIO更适合于...

    java NIO实例

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效的数据传输方式。传统的Java I/O模型(BIO)在处理大量并发连接时效率较...

    一个java NIO的例子

    总的来说,Java NIO提供了一种高效、灵活的I/O模型,尤其适合处理高并发的网络应用。这个例子"一个java NIO的例子"是学习和理解Java NIO概念和机制的一个很好的起点。通过分析和运行这个示例,开发者可以更深入地...

    java nio 读文件

    总的来说,Java NIO提供了一种更高效、灵活的方式来处理文件读取和其他I/O操作,尤其适合需要处理大量并发I/O请求的场合,例如服务器端编程。通过熟练掌握NIO,开发者可以构建出更加高效的Java应用程序。

    Java Nio selector例程

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

    Java NIO测试示例

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效、灵活的I/O操作方式。NIO与传统的 Blocking I/O(阻塞I/O)模式相比,...

    java nio 实现socket

    #### 三、NIO实现Socket通信的基本流程 基于Java NIO的Socket通信流程大致如下: 1. **创建ServerSocketChannel**:服务器端首先需要创建一个`ServerSocketChannel`,用于监听客户端的连接请求。 2. **创建...

    Java NIO Socket基本

    Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的 Blocking I/O(同步阻塞I/O)相对。NIO在Java 1.4版本引入,其设计目标是提供一种更高效、更灵活的I/O操作方式,特别适合处理大量并发连接...

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

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

Global site tag (gtag.js) - Google Analytics