1. 程式人生 > 其它 >java如何呼叫同目錄下的檔案_檔案目錄的增刪改操作?java如何實時監控?

java如何呼叫同目錄下的檔案_檔案目錄的增刪改操作?java如何實時監控?

技術標籤:java如何呼叫同目錄下的檔案

本文出自公眾號《愚公要移山》
收錄於《java碎知識點》專題

前言

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

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

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

一、程式碼實現

1、簡單案例

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

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

這裡我們監控G盤,然後我們在G盤新建檔案,然後刪除修改,就會在後臺列印相關資訊。

86ee835822a0fe72c45a826458872ee0.png

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

2、程式碼分析

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

第三步繫結,這裡只需要注意兩件重要的事情:首先,pathwatchService作為第一個引數,然後是StandardWatchEventKinds的變數引數。一共有四種。

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

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

3、原始碼分析

由於watchService是一個介面,所以分析起來也比較簡單。裡面一共包含了三個方法

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

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

結論

WatchService介面是在java7的版本中引入的。主要是處理NIO的檔案相關問題。但是WatchService其實是有很多缺點的。

  • WatchService是採用掃描式的,效率低。
  • WatchService程式碼寫起來費勁。雖然上面看起來很簡潔了,但是實際開發時麻煩。
  • WatchService不能監聽到多級目錄,事先父資料夾需要存在。

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