亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

前言

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

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

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

一、代碼實(shí)現(xiàn)

1、簡單案例

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

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

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

文件目錄的增刪改操作?java如何實(shí)時(shí)監(jiān)控?

 

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

2、代碼分析

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

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

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

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

3、源碼分析

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

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

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

結(jié)論

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

  • WatchService是采用掃描式的,效率低。
  • WatchService代碼寫起來費(fèi)勁。雖然上面看起來很簡潔了,但是實(shí)際開發(fā)時(shí)麻煩。
  • WatchService不能監(jiān)聽到多級目錄,事先父文件夾需要存在。

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

分享到:
標(biāo)簽:java
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定