自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

文件目錄發(fā)生了增刪改操作?Java如何實(shí)時(shí)監(jiān)控?

開發(fā) 后端
有時(shí)候你可能有個(gè)疑問,IDE總是可以檢測(cè)到外部文件是否發(fā)生了變化,比如你在某個(gè)類里面加了一些代碼,這時(shí)候的IDE就會(huì)彈出一個(gè)框說(shuō)你做了更改。

前言

有時(shí)候你可能有個(gè)疑問,IDE總是可以檢測(cè)到外部文件是否發(fā)生了變化,比如你在某個(gè)類里面加了一些代碼,這時(shí)候的IDE就會(huì)彈出一個(gè)框說(shuō)你做了更改。再或者是某個(gè)文件夾下的文件發(fā)生了改變,比如新建了一個(gè)或者是刪除了一個(gè)等等。這時(shí)候我們的IDE依然可以檢測(cè)到。這個(gè)功能到底是如何實(shí)現(xiàn)的呢?這篇文章主要是研究NIO的其中一個(gè)類,叫做WatchService。

也有一些其他的方式可以輕松地實(shí)現(xiàn)監(jiān)控文件夾的功能,比如說(shuō)java輪詢的方式,或者是common-io的方式,我會(huì)慢慢比較。

OK,我們直接來(lái)看一下簡(jiǎn)單例子如何實(shí)現(xiàn),再去分析如何實(shí)現(xiàn)的?

一、代碼實(shí)現(xiàn)1、簡(jiǎn)單案例

這個(gè)代碼很簡(jiǎn)單,只需要四步:

  1. public static void main(String[] args) throws Exception { 
  2.    //第一步:取得WatchService 
  3.    WatchService watchService = FileSystems.getDefault().newWatchService(); 
  4.    //第二步:確定要監(jiān)控的路徑 
  5.    Path path = Paths.get("G:\\"); 
  6.    //第三步:為本路徑綁定WatchService,并確定監(jiān)控的事件 
  7.    path.register( 
  8.        watchService, 
  9.        StandardWatchEventKinds.ENTRY_CREATE, 
  10.        StandardWatchEventKinds.ENTRY_DELETE, 
  11.        StandardWatchEventKinds.ENTRY_MODIFY); 
  12.    WatchKey key
  13.    //第四步:當(dāng)有事件時(shí),開始觸發(fā) 
  14.    while ((key = watchService.take()) != null) { 
  15.        for (WatchEvent<?> event : key.pollEvents()) { 
  16.           System.out.println("事件" + event.kind() + "發(fā)生了,文件是:" + event.context()); 
  17.        } 
  18.        key.reset(); 
  19.    } 

這里我們監(jiān)控G盤,然后我們?cè)贕盤新建文件,然后刪除修改,就會(huì)在后臺(tái)打印相關(guān)信息。

 

現(xiàn)在就可以監(jiān)控了,很簡(jiǎn)單。

2、代碼分析

第一步和第二步,新建一個(gè)取得WatchService和取得要監(jiān)控的路徑,這個(gè)很容易理解。

第三步綁定,這里只需要注意兩件重要的事情:首先,path將watchService作為第一個(gè)參數(shù),然后是StandardWatchEventKinds的變量參數(shù)。一共有四種。

  • StandardWatchEventKinds.ENTRY_CREATE—當(dāng)有新文件時(shí)觸發(fā)??赡苁莿?chuàng)建了一個(gè)新文件。
  • StandardWatchEventKinds.ENTRY_MODIFY—當(dāng)文件被修改時(shí)觸發(fā)。所有的文件編輯都會(huì)觸發(fā)這個(gè)事件。在一些平臺(tái)上,甚至改變文件屬性也會(huì)觸發(fā)它。
  • StandardWatchEventKinds.ENTRY_DELETE—當(dāng)文件被刪除、移動(dòng)或重命名時(shí)觸發(fā)。
  • StandardWatchEventKinds.OVERFLOW—觸發(fā)表示丟失或丟棄的事件。

第四步不斷監(jiān)控,當(dāng)watchService里面不為空時(shí),開始獲取相應(yīng)的事件,并poll彈出。最后還有一個(gè)reset 表示回退到相應(yīng)的句柄,繼續(xù)處理下一次事件。

3、源碼分析

由于watchService是一個(gè)接口,所以分析起來(lái)也比較簡(jiǎn)單。里面一共包含了三個(gè)方法

  1. //方法1:關(guān)閉watchService 
  2. @Override 
  3. void close() throws IOException; 
  4. //方法2:彈出事件 
  5. WatchKey poll(); 
  6. //方法3:帶有參數(shù)的彈出 
  7. WatchKey poll(long timeout, TimeUnit unit) 
  8.         throws InterruptedException; 
  9. //方法4:獲取事件。 
  10. WatchKey take() throws InterruptedException; 

由于方法比較簡(jiǎn)單,所以我們可以直接看方法上的注釋就可以了。

結(jié)論

WatchService接口是在java7的版本中引入的。主要是處理NIO的文件相關(guān)問題。但是WatchService其實(shí)是有很多缺點(diǎn)的。

WatchService是采用掃描式的,效率低。

WatchService代碼寫起來(lái)費(fèi)勁。雖然上面看起來(lái)很簡(jiǎn)潔了,但是實(shí)際開發(fā)時(shí)麻煩。

WatchService不能監(jiān)聽到多級(jí)目錄,事先父文件夾需要存在。

鑒于以上原因,在簡(jiǎn)單的實(shí)現(xiàn)時(shí),可以使用,但是還有一個(gè)更強(qiáng)大的工具commons-io,使用更簡(jiǎn)單也更加的高效。下篇文章給出。

 

責(zé)任編輯:武曉燕 來(lái)源: 愚公要移山
相關(guān)推薦

2023-03-31 08:12:30

操作系統(tǒng)nanosleep信號(hào)

2019-09-16 17:16:29

Hadoop數(shù)據(jù)湖數(shù)據(jù)結(jié)構(gòu)

2022-12-13 10:59:47

devtoolMemory

2019-11-07 15:39:36

數(shù)據(jù)庫(kù)MySQL文章

2021-08-09 13:34:14

Python開發(fā)數(shù)據(jù)

2021-08-30 13:08:54

Linux實(shí)時(shí)監(jiān)控日志文件

2023-02-27 07:37:56

Curl操作SQL

2019-11-12 14:41:41

Redis程序員Linux

2016-10-13 19:16:28

Python編程語(yǔ)言mysql

2023-06-08 08:13:43

2020-10-29 08:39:45

JSONJava對(duì)象

2020-08-17 12:47:07

Mozilla裁員瀏覽器

2010-02-07 09:00:29

AndroidLinux Kerne

2019-08-26 09:35:25

命令ping抓包

2017-12-28 15:40:16

開源LinuxGitHub

2021-01-18 08:23:23

內(nèi)存時(shí)底層CPU

2021-04-11 10:40:16

Git軟件開發(fā)

2024-12-10 13:17:41

2020-09-01 11:40:01

HTTPJavaTCP

2015-07-03 09:27:43

網(wǎng)絡(luò)閏秒
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)