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;另一种…

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;都是范…

如何在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;已此为题材而开发的游戏也不在少数。近日泛欧洲游戏信息组织又为一款该种题材…

Android之仿微信图片选择器

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

loss function

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

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

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

FindBugs和JSR-305

假设那组开发人员在大型项目的各个部分上并行工作–一些开发人员在进行服务实现&#xff0c;而其他开发人员在使用该服务的代码。 考虑到API的假设&#xff0c;两个小组都同意服务API&#xff0c;并开始单独工作。 您认为这个故事会有幸福的结局吗&#xff1f; 好吧&#xff0c…

什么是Akka?

在深入研究什么是Akka之前&#xff0c;让我们退后一步来了解并发编程的概念在应用程序开发世界中是如何演变的。 应用程序已经从大型的整体程序演变为面向对象的模型。 随着Java EE和Spring框架的出现&#xff0c;应用程序设计演变为更多的基于流程或任务的设计模型。 EJB或Poj…

Unity3d 实现顶点动画

在今年GDC上发现一个非常有趣的演讲&#xff0c;叫做Animating With Math&#xff0c;遂实现之&#xff0c;是讲述顶点shader动画的&#xff0c;举了几个经典的例子&#xff0c;但是讲者并没有给代码&#xff0c;而是像虚幻引擎那样的节点&#xff0c;这样更加清楚明了之前博主…

windows2012同步linux时间,Windows server2012时间同步NTP配置

遇到经常服务器时间无法同步&#xff0c;可以自己建立一台时间同步服务器&#xff0c;NTP配置如下&#xff1a;一、服务端配置 (Ntp服务器&#xff0c;客户端将根据这台服务器的时间进行同步)1、微软键R键&#xff0c;进入“运行”&#xff0c;输入“regedit”,进入注册表2、 H…

Java EE 6示例– Galleria第2部分

您可能在最后一篇Java EE 6 Galleria示例帖子中关注了我。 第一个是基本介绍。 第二个是关于在最新的GlassFish上运行它。 有人提到RedHat&#xff0c;我们应该研究将这个示例从GlassFish中移除。 很好;&#xff09;感谢您的好主意。 这正是我们今天要做的。 我将把Galleria示例…

与reCAPTCHA的Spring集成

有时我们只需要CAPTCHA &#xff0c;这是一个可悲的事实。 今天&#xff0c;我们将学习如何与reCAPTCHA集成。 因为主题本身并不是特别有趣和高级&#xff0c;所以我们将通过使用Spring Integration处理低级细节来过度设计&#xff08;&#xff1f;&#xff09;。 Google决定使…

《机器学习基石》---感知机算法

1 推导感知机模型 基本思想是&#xff0c;把特征的线性加权值作为一个分数&#xff0c;根据这个分数与一个门限值的关系来进行分类&#xff1a; 我们加一个特征x0等于1&#xff0c;门限值就可以放到w里面去&#xff0c;得到更简单的形式&#xff1a; 这就是感知机模型&#xff…

Python之路【第八篇】:堡垒机实例以及数据库操作

Python之路【第八篇】&#xff1a;堡垒机实例以及数据库操作 堡垒机前戏 开发堡垒机之前&#xff0c;先来学习Python的paramiko模块&#xff0c;该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接&#xff1a; 12…

ADF BC:创建绑定到业务组件的UI表

在此示例中&#xff0c;我们将展示如何创建绑定到业务组件的简单UI表&#xff08;af&#xff1a;table&#xff09;。 我再次尝试使用简单的标准在网上进行搜索&#xff1a; “如何创建绑定到业务组件ADF 11g的af&#xff1a;table” 我必须承认我没有得到我想要的答案。 信息…

MyBaits 错误分析

错误原因&#xff1a;在DAO的映射文件中&#xff0c;在映射标签中的type类型写成DAO类了&#xff0c;应该写成javaBean转载于:https://www.cnblogs.com/shuaiandjun/p/5428847.html