怎么在JAVA中利用WatchService监控文件

今天就跟大家聊聊有关怎么在JAVA中利用WatchService监控文件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

成都创新互联专业为企业提供阿克苏网站建设、阿克苏做网站、阿克苏网站设计、阿克苏网站制作等企业网站建设、网页设计与制作、阿克苏企业网站模板建站服务,10多年阿克苏做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

使用场景

  1. 场景一:比如系统中的配置文件,一般都是系统启动的时候只加载一次,如果想修改配置文件,还须重启系统。如果系统想热加载一般都会定时轮询对比配置文件是否修改过,如果修改过重新加载。

  2. 场景二:监控磁盘中的文件变化,一般需要把磁盘中的所有文件全部加载一边,定期轮询一遍磁盘,跟上次的文件状态对比。如果文件、目录过多,每次遍历时间都很长,而且还不是实时监控。

而以上两种场景就比较适合使用 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;
import java.util.List;

public class FileWatchServiceDemo {

  public static void main(String[] args) throws IOException, InterruptedException {
    WatchService watchService = FileSystems.getDefault().newWatchService();

    String filePath = "D:/aa";

    Paths.get(filePath).register(watchService, StandardWatchEventKinds.ENTRY_CREATE,
        StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE);

    while(true){
      WatchKey key = watchService.take();
      List> watchEvents = key.pollEvents();
      for (WatchEvent event : watchEvents) {
        if(StandardWatchEventKinds.ENTRY_CREATE == event.kind()){
          System.out.println("创建:[" + filePath + "/" + event.context() + "]");
        }
        if(StandardWatchEventKinds.ENTRY_MODIFY == event.kind()){
          System.out.println("修改:[" + filePath + "/" + event.context() + "]");
        }
        if(StandardWatchEventKinds.ENTRY_DELETE == event.kind()){
          System.out.println("删除:[" + filePath + "/" + event.context() + "]");
        }
        
      }
      key.reset();
    }
  }
}

1、使用 Path 来指定要监控的目录

2、Path.register() 方法注册要监控指定目录的那些事件(创建、修改、删除)

 StandardWatchEventKinds.ENTRY_CREATE //创建
 StandardWatchEventKinds.ENTRY_MODIFY //修改
 StandardWatchEventKinds.ENTRY_DELETE //删除

3、调用watchService.take(); 获取监控目录文件的变化的WatchKey。该方法是阻塞方法,如果没有文件修改,则一直阻塞。

4、遍历所有的修改事件,并做相应处理。

5、完成一次监控就需要重置监控器。

不使用 WatchService 监控的弊端

  1. 非常繁琐,必须自己手动开启一个后台线程每隔一段时间遍历一次目标节点并记录当前状态,然后和上一次遍历的状态对比,如果不相同就表示发生了变化,再采取相应的操作,这个过程非常长,都需要用户自己手动实现;

  2. 效率低:效率都消耗在了遍历、保存状态、对比状态上了!这是因为旧版本的Java无法很好的利用OS文件系统的功能,因此只能这样笨拙地监控文件变化;

看完上述内容,你们对怎么在JAVA中利用WatchService监控文件有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。


网站栏目:怎么在JAVA中利用WatchService监控文件
文章URL:http://scyanting.com/article/gchdpe.html