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.pswp.cn/news/373235.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373235.shtml
英文地址,請注明出處:http://en.pswp.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;使用集合…