WatchService監控檔案變化
阿新 • • 發佈:2019-01-09
概述
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事件。