掃二維碼與項目經理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流
前言

余慶網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、APP開發(fā)、響應式網(wǎng)站開發(fā)等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)建站于2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經驗和運維經驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設就選創(chuàng)新互聯(lián)建站。
有時候你可能有個疑問,IDE總是可以檢測到外部文件是否發(fā)生了變化,比如你在某個類里面加了一些代碼,這時候的IDE就會彈出一個框說你做了更改。再或者是某個文件夾下的文件發(fā)生了改變,比如新建了一個或者是刪除了一個等等。這時候我們的IDE依然可以檢測到。這個功能到底是如何實現(xiàn)的呢?這篇文章主要是研究NIO的其中一個類,叫做WatchService。
也有一些其他的方式可以輕松地實現(xiàn)監(jiān)控文件夾的功能,比如說java輪詢的方式,或者是common-io的方式,我會慢慢比較。
OK,我們直接來看一下簡單例子如何實現(xiàn),再去分析如何實現(xiàn)的?
一、代碼實現(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;
- //第四步:當有事件時,開始觸發(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盤新建文件,然后刪除修改,就會在后臺打印相關信息。
現(xiàn)在就可以監(jiān)控了,很簡單。
2、代碼分析
第一步和第二步,新建一個取得WatchService和取得要監(jiān)控的路徑,這個很容易理解。
第三步綁定,這里只需要注意兩件重要的事情:首先,path將watchService作為第一個參數(shù),然后是StandardWatchEventKinds的變量參數(shù)。一共有四種。
第四步不斷監(jiān)控,當watchService里面不為空時,開始獲取相應的事件,并poll彈出。最后還有一個reset 表示回退到相應的句柄,繼續(xù)處理下一次事件。
3、源碼分析
由于watchService是一個接口,所以分析起來也比較簡單。里面一共包含了三個方法
- //方法1:關閉watchService
- @Override
- void close() throws IOException;
- //方法2:彈出事件
- WatchKey poll();
- //方法3:帶有參數(shù)的彈出
- WatchKey poll(long timeout, TimeUnit unit)
- throws InterruptedException;
- //方法4:獲取事件。
- WatchKey take() throws InterruptedException;
由于方法比較簡單,所以我們可以直接看方法上的注釋就可以了。
結論
WatchService接口是在java7的版本中引入的。主要是處理NIO的文件相關問題。但是WatchService其實是有很多缺點的。
WatchService是采用掃描式的,效率低。
WatchService代碼寫起來費勁。雖然上面看起來很簡潔了,但是實際開發(fā)時麻煩。
WatchService不能監(jiān)聽到多級目錄,事先父文件夾需要存在。
鑒于以上原因,在簡單的實現(xiàn)時,可以使用,但是還有一個更強大的工具commons-io,使用更簡單也更加的高效。下篇文章給出。

我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流