1. 程式人生 > >WatchService監控檔案變化

WatchService監控檔案變化

概述

Java 7 對原有的NIO進行了重大的改進,新增了Path介面(和平臺無關的路徑),還有Paths,Files兩個工具類。好了進入正題WatchService,在前面的Java版本中,如果想監控某個檔案的變化,需要啟動一個後臺程序,每隔一段時間去遍歷指定的目錄,如果結果和上次的不同則認為發生了變化。而WatchService在這方面有更好的效能,但是需要結合Path類的register方法來使用。register方法的第一個引數需要制定一個WatchService來進行監聽,後面為可選引數,指定的是需要監聽哪些事件。

程式碼實現


import java.io.IOException
; import java.nio.file.FileSystems; import java.nio.file.Paths; import java.nio.file.StandardWatchEventKinds; import java.nio.file.WatchEvent; import java.nio.file.WatchKey; import java.nio.file.WatchService; public class WatchServiceTest { public static void main(String[] args) throws InterruptedException { try { //得到一個例項 WatchService watcher = FileSystems.getDefault
().newWatchService(); //結合Path的register方法來監控目錄 C:\Users\Administrator\Desktop\123456\ Paths.get("C:\\Users\\Administrator\\Desktop", "123456") .register(watcher, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY
_MODIFY); while(true){ WatchKey key = watcher.take(); for(WatchEvent<?> event : key.pollEvents()){ String ev = event.context()+""; if("ENTRY_CREATE".equals(event.kind())) System.out.println(ev+ " 檔案 " + "建立了"); else if("ENTRY_MODIFY".equals(event.kind()+"")) System.out.println(ev+ " 檔案--"+ "被修改了"); else if("ENTRY_DELETE".equals(event.kind()+"")) System.out.println(ev+ " 檔案 " + "被刪除了"); } //重設WatchKey boolean vaild = key.reset(); if(!vaild) break; } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

總結

雖然可以簡單實現了檔案的監控,但需要注意,如果修改檔名,會先觸發delete事件,再觸發modify事件;如果在該目錄下有其他資料夾,在子資料夾中發生的一切事件都被認為是被監控的目錄下的modify事件。