Java 7:WatchService

在Java 7的所有新功能中,更有趣的是WatchService,它增加了监视目录更改的功能。 WatchService直接映射到本机文件事件通知机制(如果有)。

如果本机事件通知机制不可用,则默认实现将使用轮询。 结果,响应性,事件的顺序和可用细节是特定于实现的。 (注意:有一篇有关使用Guava EventBus处理WatchService事件的文章 )

观看目录

Path接口实现了将WatchService对象和WatchEvent.Kind类型的varargs作为参数的register方法。 有4个事件需要注意:

  1. ENTRY_CREATE
  2. ENTRY_DELETE
  3. ENTRY_MODIFY
  4. 溢出

前三种是不言自明的,而OVERFLOW则表示事件可能丢失或丢弃。 通过调用FileSystem.newWatchService()创建WatchService。 观看目录是通过在WatchService中注册Path对象来完成的:

import static java.nio.file.StandardWatchEventKinds.*;
Path path = Paths.get("/home");
WatchService watchService = FileSystems.getDefault().newWatchService();
WatchKey watchKey = path.register(watchService,ENTRY_CREATE,ENTRY_DELETE,ENTRY_MODIFY);

从示例中可以看到,register方法返回一个WatchKey对象。 WatchKey是表示在WatchService中注册路径的令牌。

WatchKey

作为注册过程的结果,WatchKey处于“就绪”状态,并被视为有效。 WatchKey保持有效,直到发生以下情况之一:

  1. WatchKey.cancel()被调用。
  2. 正在监视的目录不再可用。
  3. WatchService对象已关闭。

检查变更

当检测到更改时,WatchKey状态将设置为“已信号发送”,并将其放入队列中进行处理。 使WatchKeys脱离队列涉及调用WatchService.poll()或WatchService.take()。 这是一个基本示例:

private boolean notDone = true;
while(notDone){try{WatchKey watchKey = watchService.poll(60,TimeUnit.SECONDS);List<WatchEvent.Kind<?>> events = watchKey.pollEvents();for(WatchEvent event : events){...process the events}if(!watchKey.reset()){...handle situation no longer valid}}catch(InterruptedException e){Thread.currentThread().interrupt();}

在第5行上,我们调用pollEvents方法来检索此WatchKey对象的所有事件。 在第9行,您会注意到对reset方法的调用。 reset方法将WatchKey状态重新设置为“就绪”,并返回一个布尔值,指示WatchKey是否仍然有效。 如果有任何未决事件,则WatchKey将立即重新排队,否则它将保持就绪状态,直到检测到新事件。 在已取消或处于就绪状态的WatchKey上调用reset无效。 如果WatchKey在排队时被取消,它将在队列中扩大直到被取回。 如果目录已删除或不再可用,取消也会自动发生。

处理事件

现在我们已经检测到一个事件,我们如何确定:

  1. 事件发生在哪个目录? (假设注册了多个目录)
  2. 实际事件是什么? (假设收听多个事件)
  3. 事件的目标是什么,即创建,删除或更新了哪个Path对象?

跳到上一个示例的第6行,我们将从WatchKey和WatchEvent中解析所需的信息:

//WatchKey watchable returns the calling Path object of Path.registerPath watchedPath = (Path) watchKey.watchable();//returns the event typeStandardWatchEventKinds eventKind = event.kind();//returns the context of the eventPath target = (Path)event.context();

在第6行,我们看到了WatchEvent.context方法被调用。 如果事件是创建,删除或更新,并且该事件相对于监视目录,则context方法将返回Path对象。 重要的是要知道,当收到事件时,不能保证执行该操作的程序已经完成,因此可能需要一定程度的协调。

结论

WatchService是Java 7中新的java.nio.file包的一个非常有趣的功能。也就是说,WatchService需要牢记两件事:

  1. WatchService不会为监视目录的子目录拾取事件。
  2. 我们仍然需要轮询WatchService的事件,而不是接收异步通知。

为了解决上述问题,有一篇后续文章,使用Guava EventBus处理WatchService事件 。 感谢您的宝贵时间,在下一篇文章中见。


资源资源

  1. java.nio.file软件包,其中包含此处讨论的WatchService,WatchKey和WatchEvent对象。
  2. 演示WatchService的单元测试

参考: Java 7的新增功能: JCG合作伙伴提供的 WatchService   比尔·贝杰克(Bill Bejeck)在“ 编码随机思想”博客上。


翻译自: https://www.javacodegeeks.com/2012/02/java-7-watchservice.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373235.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

做一件事情的3个关键指标:兴趣、能力和回报

最近突然有了一点新的感悟&#xff0c;在原有的认识基础之上。关于找工作&#xff0c;大家说的最多的&#xff0c;根据自己的“兴趣”和“能力”。我觉得这是不够的&#xff0c;还应该加上一个“回报”。兴趣&#xff1a;对一件事有没有愿望去尝试&#xff0c;侧重“好奇心”。…

iOS应用内支付(IAP)详解

在iOS开发中如果涉及到虚拟物品的购买&#xff0c;就需要使用IAP服务&#xff0c;我们今天来看看如何实现。 在实现代码之前我们先做一些准备工作&#xff0c;一步步来看。 1、IAP流程 IAP流程分为两种&#xff0c;一种是直接使用Apple的服务器进行购买和验证&#xff0c;另一种…

vagrant box php,vagrant box php开发环境配置 -- nginx

centos7.3 直接用yum安装nginx的版本是1.10.2&#xff0c;当前的最新稳定版是1.10.3&#xff0c;暂时不更新&#xff0c;直接安装yum安装nginxsudo yum install -y nginx测试nginx -t启动sudo service nginx startps -ef|grep nginxcurl -i localhost在virtualbox设置网络的端口…

使用ASM 4处理Java类文件–第二部分:Tree API

什么是ASM树API&#xff1a; ASM树API是ASM的一部分&#xff0c;可让您创建/修改内存中的类。 该类被视为信息树。 像整个类一样&#xff0c;它是ClassNode的实例&#xff0c;其中包含FieldNode对象列表&#xff0c;MethodNode对象列表等。本文假设读者已经在这里阅读了第一部分…

php 去除 html 属性,用PHP 去掉所有html标签里的部分属性

用PHP 去掉所有html标签里的部分属性http://zhidao.baidu.com/question/418471924.html用PHP 去掉所有html标签里的部分属性 tppabsset_time_limit(0);function view_dir($dir){$dpopendir($dir); //打开目录句柄//echo "".$dir."";$path2;while ($file r…

在Windows上安装Elasticsearch 5.0

在windows上安装Elasticsearch Elasticsearch可以使用.zip软件包安装在Windows上。 elasticsearch-service.bat命令&#xff0c;它将设置Elasticsearch作为服务运行。 Elasticsearch的最新稳定版在Download Elasticsearch下载&#xff0c;其他的版本在Past Releases page下载。…

Java EE 6示例– Galleria

您是否一直想知道在哪里可以找到使用Java EE 6构建的良好端到端示例&#xff1f; 我有。 您在网上找到的大多数东西都是非常基础的&#xff0c;不能解决现实世界中的问题。 Java EE 6教程就是这样。 所有其他内容&#xff0c;例如Adam Bien所发表的大多数内容&#xff0c;都是范…

二维有限体积 matlab,二维有限体积法计算热传导及源码.pdf

二维有限体积法计算热传导及源码//#include "stdafx.h"#include #include #include #include #include using namespace std;#define q 500#define k 1000void main (){ //input the value you want:double L,dx,dy,T,Ax,Ay,d;int m,n,i,j,kk,mm ;//char str1[20];ch…

ubuntu与win10互换硬盘

实例&#xff1a;将sdb上的ubuntu转移至sda&#xff0c;将sda上的win转移至sdb1. 备份资料2. 制作老毛桃PE盘3. 格式化sda4. dd if/dev/sdb of/dev/sda ,将sdb克隆到sda上5. 利用Linux live cd修复grub2&#xff08;BIOS不会认GPT分区&#xff09; sudo grub-install /dev/sda …

如何在Jetty中使用SPDY

SPDY是Google提出的一种新协议&#xff0c;是针对网络的新协议。 SPDY与HTTP兼容&#xff0c;但尝试通过压缩&#xff0c;多路复用和优先级降低网页负载。准确地说&#xff0c;快速的目标是&#xff1a;&#xff08; http://dev.chromium.org/spdy/spdy-whitepaper &#xff09…

虐杀外星人java,逆天游戏《毁灭全人类2》登PS4 外星人疯狂虐杀地球人

逆天游戏《毁灭全人类2》登PS4 外星人疯狂虐杀地球人2016-10-17 10:45:58来源&#xff1a;游戏下载编辑&#xff1a;小年青评论(0)广大的小伙伴都有看过许多外星人企图入侵毁灭地球的电影&#xff0c;已此为题材而开发的游戏也不在少数。近日泛欧洲游戏信息组织又为一款该种题材…

电脑快捷键大全

最常用的快捷键F5------刷新 DELETE-----删除 TAB----改变焦点CTRLC-----复制 CTRLX-----剪切 CTRLV----粘贴CTRLA-----全选 CTRLZ-----撤销 CTRLS-----保存 ALTF4-----关闭 CTRLY-----恢复 ALTTAB-----切换CTRLF5---强制刷新…

ORM仇恨者无法理解

我看过无数的文章和评论&#xff08;尤其是评论&#xff09;&#xff0c;它们告诉我们ORM&#xff08;对象关系映射&#xff09;的概念有多糟糕&#xff0c;糟糕和错误。 以下是通常的声明&#xff0c;以及我对它们的评论&#xff1a; “它们很慢” –映射有一些开销&#xff0…

Android之仿微信图片选择器

先上效果图。第一张图显示的是“相机”文件夹中的所有图片&#xff1b;通过点击多张图片可以到第二张图所示的效果&#xff08;被选择的图片会变暗&#xff0c;同时选择按钮变亮&#xff09;&#xff1b;点击最下面的那一栏可以到第三张图所示的效果&#xff08;显示手机中所有…

oracle 快照用途,Oracle快照原理及实现总结

oracle数据库的快照是一个表&#xff0c;它包含有对一个本地或远程数据库上一个或多个表或视图的查询的结果。也就是说快照根本的原理就是将本地或远程数据库上的一个查询结果保存在一个表中。以下是建立的Snapshot&#xff0c;目的是从业务数据库上将数据Copy到处理数据库上&a…

loss function

什么是loss? loss: loss是我们用来对模型满意程度的指标。loss设计的原则是&#xff1a;模型越好loss越低&#xff0c;模型越差loss越高&#xff0c;但也有过拟合的情况。     loss function: 在分类问题中&#xff0c;输入样本经过含权重矩阵θ的模型后会得出关于各个类别…

复杂的(事件)世界

这篇博客文章试图总结CEP领域中的技术&#xff0c;并探讨它们的主要功能和不足。 有时似乎过度使用了CEP一词&#xff08;就像ESB一样&#xff09;&#xff0c;下面的文章反映了我们对它的理解和理解。 ESPER&#xff08; http://esper.codehaus.org/ &#xff09;是流行的开源…

oracle查询表的id,oracle 查看所有用户及密码 实现Oracle查询用户所有表

1、oracle 查看所有用户及密码SQL> select username from dba_users;2、 实现Oracle查询用户所有表下面为您介绍的语句用于实现Oracle查询用户所有表&#xff0c;如果您对oracle查询方面感兴趣的话&#xff0c;不妨一看。select * from all_tab_comments-- 查询所有用户的表…

php 字符串加密与解密

/** * param $data 需要加密的字符串 * param $key 加密的密码 * return string 加密后的字符串 */function _encrypt($data, $key){ $key md5($key); $x 0; $len strlen($data); $l strlen($key); $char; $str; for ($i …

java如何从方法返回多个值

本文介绍三个方法&#xff0c;使java方法返回多个值。 方法1&#xff1a;使用集合类方法2&#xff1a;使用封装对象方法3&#xff1a;使用引用传递示例代码如下&#xff1a; import java.util.HashMap; import java.util.Map;public class Test {/*** 方法1&#xff1a;使用集合…