成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

文件目錄發生了增刪改操作?Java如何實時監控?

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

前言

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

也有一些其他的方式可以輕松地實現監控文件夾的功能,比如說java輪詢的方式,或者是common-io的方式,我會慢慢比較。

OK,我們直接來看一下簡單例子如何實現,再去分析如何實現的?

一、代碼實現1、簡單案例

這個代碼很簡單,只需要四步:

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

這里我們監控G盤,然后我們在G盤新建文件,然后刪除修改,就會在后臺打印相關信息。

 

現在就可以監控了,很簡單。

2、代碼分析

第一步和第二步,新建一個取得WatchService和取得要監控的路徑,這個很容易理解。

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

  • StandardWatchEventKinds.ENTRY_CREATE—當有新文件時觸發??赡苁莿摻艘粋€新文件。
  • StandardWatchEventKinds.ENTRY_MODIFY—當文件被修改時觸發。所有的文件編輯都會觸發這個事件。在一些平臺上,甚至改變文件屬性也會觸發它。
  • StandardWatchEventKinds.ENTRY_DELETE—當文件被刪除、移動或重命名時觸發。
  • StandardWatchEventKinds.OVERFLOW—觸發表示丟失或丟棄的事件。

第四步不斷監控,當watchService里面不為空時,開始獲取相應的事件,并poll彈出。最后還有一個reset 表示回退到相應的句柄,繼續處理下一次事件。

3、源碼分析

由于watchService是一個接口,所以分析起來也比較簡單。里面一共包含了三個方法

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

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

結論

WatchService接口是在java7的版本中引入的。主要是處理NIO的文件相關問題。但是WatchService其實是有很多缺點的。

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

WatchService代碼寫起來費勁。雖然上面看起來很簡潔了,但是實際開發時麻煩。

WatchService不能監聽到多級目錄,事先父文件夾需要存在。

鑒于以上原因,在簡單的實現時,可以使用,但是還有一個更強大的工具commons-io,使用更簡單也更加的高效。下篇文章給出。

 

責任編輯:武曉燕 來源: 愚公要移山
相關推薦

2023-03-31 08:12:30

操作系統nanosleep信號

2019-09-16 17:16:29

Hadoop數據湖數據結構

2022-12-13 10:59:47

devtoolMemory

2019-11-07 15:39:36

數據庫MySQL文章

2021-08-09 13:34:14

Python開發數據

2019-11-12 14:41:41

Redis程序員Linux

2021-08-30 13:08:54

Linux實時監控日志文件

2020-08-17 12:47:07

Mozilla裁員瀏覽器

2023-02-27 07:37:56

Curl操作SQL

2016-10-13 19:16:28

Python編程語言mysql

2023-06-08 08:13:43

2020-10-29 08:39:45

JSONJava對象

2019-08-26 09:35:25

命令ping抓包

2010-02-07 09:00:29

AndroidLinux Kerne

2017-12-28 15:40:16

開源LinuxGitHub

2021-04-11 10:40:16

Git軟件開發

2021-01-18 08:23:23

內存時底層CPU

2023-08-29 16:26:20

Linux命令行

2015-07-03 09:27:43

網絡閏秒

2020-09-01 11:40:01

HTTPJavaTCP
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品欧美一区二区精品久久久 | 99色在线| 日韩一区二区三区精品 | 中文字幕一区二区三区四区五区 | 黄色片在线免费看 | 亚洲香蕉在线视频 | 能看的av网站 | 午夜爱爱网 | 韩国av一区二区 | 成人超碰| 国产精品久久精品 | 黑人巨大精品欧美一区二区免费 | 亚洲高清在线 | av中文字幕网 | 欧美 日本 国产 | 天堂免费 | 国产原创在线观看 | 亚洲一区二区免费电影 | 亚洲视频一区 | 国产区免费视频 | 欧美激情啪啪 | 欧美视频在线看 | 亚洲电影第1页 | 亚洲一区二区精品视频 | 日本精品免费在线观看 | 午夜国产一级 | 亚洲综合二区 | 人人干人人干人人 | 国产精品一区二区视频 | 免费国产视频 | 国产精品久久久久久久久免费高清 | 毛片网站在线观看视频 | 色婷婷综合久久久中字幕精品久久 | 韩国久久精品 | 免费性视频 | 欧美久久久久久 | 精品成人69xx.xyz | 午夜国产 | 亚洲一区二区三区在线播放 | 中文字幕在线观看一区 | 久久成人一区 |