- 浏览: 2182614 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (682)
- 软件思想 (7)
- Lucene(修真篇) (17)
- Lucene(仙界篇) (20)
- Lucene(神界篇) (11)
- Solr (48)
- Hadoop (77)
- Spark (38)
- Hbase (26)
- Hive (19)
- Pig (25)
- ELK (64)
- Zookeeper (12)
- JAVA (119)
- Linux (59)
- 多线程 (8)
- Nutch (5)
- JAVA EE (21)
- Oracle (7)
- Python (32)
- Xml (5)
- Gson (1)
- Cygwin (1)
- JavaScript (4)
- MySQL (9)
- Lucene/Solr(转) (5)
- 缓存 (2)
- Github/Git (1)
- 开源爬虫 (1)
- Hadoop运维 (7)
- shell命令 (9)
- 生活感悟 (42)
- shell编程 (23)
- Scala (11)
- MongoDB (3)
- docker (2)
- Nodejs (3)
- Neo4j (5)
- storm (3)
- opencv (1)
最新评论
-
qindongliang1922:
粟谷_sugu 写道不太理解“分词字段存储docvalue是没 ...
浅谈Lucene中的DocValues -
粟谷_sugu:
不太理解“分词字段存储docvalue是没有意义的”,这句话, ...
浅谈Lucene中的DocValues -
yin_bp:
高性能elasticsearch ORM开发库使用文档http ...
为什么说Elasticsearch搜索是近实时的? -
hackWang:
请问博主,有用solr做电商的搜索项目?
Solr中Group和Facet的用法 -
章司nana:
遇到的问题同楼上 为什么会返回null
Lucene4.3开发之第八步之渡劫初期(八)
继昨天的NIO文件夹遍历,散仙今天要分享另外两个基于NIO的比较实用的知识,第一个分享的是使用NIO对操作系统的文件进行监控,第二个要分享的是关于操作系统的文件锁,(散仙:这个会放在下一篇博客中)。
在Java以前的版本中,如果程序想要监控文件的变化,则可以采用启动一条后台线程,定时去扫描某个文件夹,或某个文件夹下的文件,如果扫描过程中发现此次的遍历结果与上次的结果不同,则认为此文件发生了变化,当然你还得考虑怎么临时存储上一次文件的改动情况,这种方式不仅,十分繁琐而且性能也不好。
现在,在我们的NIO2里面,则提供了更为轻巧方便的监控策略,下面散仙给出一些API,以供参考:
下面,散仙给出示例源码:
运行,效果如下:
截图如下:
至此,我们的一个小型监控项目就完成了,这个技术在很多时候,都非常有用,例如一些主从架构的数据同步的场景,Master数据状态改变了,然后就可以立即同步到Slave里,这其实就跟文件系统监控的原理差不多。文件系统的监控不仅要求可靠性高,而且还得简单,好用,说到这里,不得不提下,我们分布式环境下经常用到的一个集群协作服务Zookeeper,当然zookeeper的实现原理,比我们这个小技术要复杂多了,其中的一些leader选举算法,状态一致算法都是非常复杂的,不过zookeeper的对外API提供的非常短小简单,它的安装部署也是非常容易的,有兴趣的朋友可以深入的研究一下。
远程的应该是软连接的形式吧
加油!
你们用来做什么的啊
FTP 文件监控
那不错啊,复杂不
你们用来做什么的啊
FTP 文件监控
你们用来做什么的啊
在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
截图如下:
至此,我们的一个小型监控项目就完成了,这个技术在很多时候,都非常有用,例如一些主从架构的数据同步的场景,Master数据状态改变了,然后就可以立即同步到Slave里,这其实就跟文件系统监控的原理差不多。文件系统的监控不仅要求可靠性高,而且还得简单,好用,说到这里,不得不提下,我们分布式环境下经常用到的一个集群协作服务Zookeeper,当然zookeeper的实现原理,比我们这个小技术要复杂多了,其中的一些leader选举算法,状态一致算法都是非常复杂的,不过zookeeper的对外API提供的非常短小简单,它的安装部署也是非常容易的,有兴趣的朋友可以深入的研究一下。
评论
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)
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
哈哈 这个功能 在项目里已经用了
发表评论
-
记一次log4j不打印日志的踩坑记
2019-09-22 01:58 1562### 起因 前几天一个跑有java应用的生产集群(200多 ... -
在Java里面如何解决进退两难的jar包冲突问题?
2019-07-23 19:10 1229如上图所示: es api组件依赖guava18.0 ... -
如何轻松理解二叉树的深度遍历策略
2019-07-03 23:33 1122我们知道普通的线性数据结构如链表,数组等,遍历方式单一 ... -
为什么单线程Redis性能也很出色
2019-01-21 18:02 2203高性能的服务器,不一 ... -
如何将编程语言里面的字符串转成数字?
2019-01-11 23:23 2089将字符串转成数字在很 ... -
为什么Java里面String类是不可变的
2019-01-06 18:36 1665在Java里面String类型是不可变对象,这一点毫无疑问,那 ... -
关于Java里面volatile关键字的重排序
2019-01-04 18:49 1063Java里面volatile关键字主 ... -
多个线程如何轮流打印ABC特定的次数?
2018-12-11 20:42 6037之前的一篇文章,我给 ... -
聊聊Java里面的引用传递
2018-11-16 21:21 988长久以来,在Java语言里面一直有一个争论,就是Java语言到 ... -
理解计数排序算法的原理和实现
2018-10-11 10:03 2089计数排序(Counting sort) ... -
理解Java7和8里面HashMap+ConcurrentHashMap的扩容策略
2018-09-06 11:31 3386### 前言 理解HashMap和Con ... -
关于Java里面多线程同步的一些知识
2018-07-18 09:45 1105# 关于Java里面多线程同步的一些知识 对于任何Java开 ... -
Java单例模式之双检锁深入思考
2018-07-08 12:25 3288# Java单例模式之双检锁 ... -
关于Java里面多线程同步的一些知识
2018-07-08 12:23 1120# 关于Java里面多线程同步的一些知识 对于任何Java开 ... -
重新认识同步与异步,阻塞和非阻塞的概念
2018-07-06 14:30 1471# 重新认识同步与异步 ... -
线程的基本知识总结
2018-06-27 16:27 1058### (一)创建线程的方式 (1)实现Runnable接口 ... -
Java里面volatile关键字修饰引用变量的陷阱
2018-06-25 11:42 1385# Java里面volatile关键字修饰引用变量的陷阱 如 ... -
关于Java里面的字符串拼接,你了解多少?
2018-06-25 11:28 1367# 关于Java里面的字符串 ... -
深入理解Java内存模型的语义
2018-06-25 11:39 735### 前言 Java内存模型( ... -
如何证明Java多线程中的成员变量数据是互不可见的
2018-06-21 10:09 1499前面的几篇文章主要介绍了Java的内存模型,进程和线程的定义, ...
相关推荐
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...
Java NIO,全称为Non-...总的来说,Java NIO提供了比传统I/O更灵活、更高效的数据传输机制,尤其适用于需要处理大量并发连接的网络应用,如服务器端的开发。通过合理利用NIO的特性,可以构建出高性能、低延迟的系统。
总的来说,Java NIO是一个强大的工具,对于需要处理大量并发连接和数据交换的应用来说,它提供了显著的性能提升。Netty则是NIO的一个高级封装,它进一步降低了使用NIO的复杂性,提高了开发效率。学习和理解Java NIO...
Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...
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中,处理超大数据文件的关键在于合理利用内存映射文件(Memory-Mapped Files)来提高读取效率。内存映射文件是一种将文件内容直接映射到内存中的技术,使得对文件...
Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(IO)相比,提供了更加高效的数据传输方式。在Java NIO中,"新"主要体现在非阻塞和多路复用这两个特性上,这使得NIO更适合于...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效的数据传输方式。传统的Java I/O模型(BIO)在处理大量并发连接时效率较...
总的来说,Java NIO提供了一种高效、灵活的I/O模型,尤其适合处理高并发的网络应用。这个例子"一个java NIO的例子"是学习和理解Java NIO概念和机制的一个很好的起点。通过分析和运行这个示例,开发者可以更深入地...
总的来说,Java NIO提供了一种更高效、灵活的方式来处理文件读取和其他I/O操作,尤其适合需要处理大量并发I/O请求的场合,例如服务器端编程。通过熟练掌握NIO,开发者可以构建出更加高效的Java应用程序。
java侧起server(NioUdpServer1.java),基于Java Nio的selector 阻塞等候,一个android app(NioUdpClient1文件夹)和一个java程序(UI.java)作为两个client分别向该server发数据,server收到后分别打印收到的消息...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效、灵活的I/O操作方式。NIO与传统的 Blocking I/O(阻塞I/O)模式相比,...
#### 三、NIO实现Socket通信的基本流程 基于Java NIO的Socket通信流程大致如下: 1. **创建ServerSocketChannel**:服务器端首先需要创建一个`ServerSocketChannel`,用于监听客户端的连接请求。 2. **创建...
Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的 Blocking I/O(同步阻塞I/O)相对。NIO在Java 1.4版本引入,其设计目标是提供一种更高效、更灵活的I/O操作方式,特别适合处理大量并发连接...
java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现...