码迷,mamicode.com
首页 > 其他好文 > 详细

监视目录变化

时间:2016-08-02 13:29:45      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:

1.在实际开发中可能会需要监视某个目录下的文件所发生的变化。

2.在java7之前的做法
在一个独立的线程中使用File类的listFiles方法来定时检查目录中的内容,并与之前的内容进行比较

3.java7之后的做法
NIO.2中提供了新的目录监视服务,使用这些服务可以在指定目录中的子目录或文件被创建、更新或者删除时得到事件的通知。
基于这些通知,程序可以进行相应的处理

4.被监听的对象要实现java.nio.file.Watchable接口,并通过register方法注册到表示监视服务的java.nio.file.Watchable接口的实现对象上
注册时需要指定被监视对象感兴趣的事件类型。
注册成功后,调用者可以得到一个表示这次注册行为的java.nio.file.Watchable接口的实现对象。

5.通过WatchKey接口可以获取在对应的被监听对象上所产生的事件。
每个事件用java.nio.file.WatchEvent接口来表示

6.WatchService接口也提供了获取当前所有被监视对象上的可用事件。
查询方式分为阻塞式和非阻塞式:
阻塞式使用take方法,而非阻塞式使用poll方法。
查询结果的返回值是WatchKey接口的实现对象。
调用WatchKey接口的pollEvents方法可以得到对应被监视对象上所发生的所有事件

例子:
  1. public class 目录监视服务的使用示例 {
  2. public static void main(String[] args) throws IOException, InterruptedException{
  3. //WatchService接口的实现对象是由工厂方法创建的,需要从表示文件系统的java.nio.file.FileSystem类对象中得到。
  4. WatchService service = FileSystems.getDefault().newWatchService();
  5. //被监视的对象
  6. Path path = Paths.get("C:/Users/aming/Desktop");
  7. //注册监听事件
  8. //包括创建或者重命名(ENTRY_CREATE),更新(ENTRY_MODIFY)和删除(ENTRY_DELETE)
  9. path.register(service, StandardWatchEventKinds.ENTRY_CREATE,StandardWatchEventKinds.OVERFLOW);
  10. while(true){
  11. WatchKey key = service.take();
  12. //pollEvents方法获取所有的事件
  13. for(WatchEvent<?> event:key.pollEvents()){
  14. //context方法的返回值表示的是事件上下文信息
  15. //在于目录内容变化相关的事件中,上下文信息是一个Path接口的实现对象
  16. Path createPath = (Path)event.context();
  17. //resolve方法:将当前路径当成父目录,而把参数中的路径当成子目录或者是其中的文件
  18. createPath = path.resolve(createPath);
  19. //获得文件的大小
  20. long size = Files.size(createPath);
  21. System.out.println(createPath + "==>" + size);
  22. }
  23. //在处理完一个WatchKey接口实现对象中的全部事件后
  24. //需要通过reset方法来进行重置。
  25. //只有重置之后,新的产生的同类事件才有可能从WatchService接口实现对象中再次获取。
  26. key.reset();
  27. //如果希望取消对一个目录的监视
  28. //只需要调用对应的WatcKey接口实现对象的cancel方法即可
  29. key.cancel();
  30. }
  31. }
  32. }





监视目录变化

标签:

原文地址:http://www.cnblogs.com/xiao2/p/5728484.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!