📜  注册watch服务java(1)

📅  最后修改于: 2023-12-03 15:40:44.328000             🧑  作者: Mango

注册Watch服务Java

在Java中,我们可以使用WatchService监听文件系统的变化,它主要用来监听目录下文件的增加、删除、修改等事件。在本文中,我们将会介绍如何在Java中使用WatchService进行注册服务。

WatchService简介

Java中的WatchService是一种轮询式的I/O事件监视器,可用于监视文件或文件夹的变化。它返回一个实现了WatchKey接口的对象,该对象表示被监视的目录并包含有关事件的信息。

WatchKey接口

WatchKey是WatchService返回的对象,用于指向被监视目录及其子目录(如果被注册)。它提供了以下方法:

  • pollEvents():返回所有触发的WatchEvent;如果没有任何事件发生,则返回一个空列表。
  • reset():重置此WatchKey以接收更多事件。在重置后,此WatchKey将有效。
  • isValid():如果此WatchKey仍然有效,则返回true。
  • cancel():取消此WatchKey的可变性。已注销的WatchKey将不再有效。
  • watchable():返回此WatchKey所关联的Watchable对象。
WatchEvent接口

WatchEvent是WatchService返回的对象,用于指向已触发的事件。它包含以下属性:

  • kind():返回WatchEvent.Kind,即事件的类型,例如ENTRY_CREATE、ENTRY_DELETE、ENTRY_MODIFY、OVERFLOW。
  • count():返回计数器,即导致此事件的次数。
  • context():返回WatchEvent.Context,即触发事件的文件路径。
实现方法

首先,我们需要创建一个WatchService对象,如下所示:

WatchService watchService = FileSystems.getDefault().newWatchService();

接下来,我们需要使用Path对象注册我们要监视的目录信息。在注册目录时,需要同时传递要监视的事件类型(ENTRY_CREATE、ENTRY_DELETE、ENTRY_MODIFY),如下所示:

Path path = Paths.get("path/to/watch/dir");
path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);

最后,我们需要不断轮询WatchService来获取已触发的事件,如下所示:

while (true) {
    WatchKey watchKey = watchService.take(); // 获取下一个WatchKey事件

    List<WatchEvent<?>> events = watchKey.pollEvents(); // 获取 WatchEvent 列表
    for (WatchEvent<?> event : events) {
        System.out.println("Event kind:" + event.kind() + ". File affected: " + event.context() + ".");
    }
    watchKey.reset(); // 重置WatchKey
}

重要事项:如果未重置watchKey,则在调用take()方法时会返回相同的key。 因此,必须始终重置watchKey,以便能够接收更多事件。

完整示例代码
import java.nio.file.*;
import java.io.*;

public class WatchServiceDemo {
    public static boolean running = true;

    public static void main(String[] args) throws IOException, InterruptedException {
        // 在FileSystem中创建一个新的WatchService
        WatchService watchService = FileSystems.getDefault().newWatchService();
        
        Path path = Paths.get("path/to/watch/dir");
        path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);

        while (running) {
            WatchKey watchKey = watchService.take(); // 获取下一个WatchKey事件
            
            List<WatchEvent<?>> events = watchKey.pollEvents(); // 获取 WatchEvent 列表
            for (WatchEvent<?> event : events) {
                System.out.println("Event kind:" + event.kind() + ". File affected: " + event.context() + ".");
            }
            watchKey.reset(); // 重置WatchKey
        }
    }
}
总结

WatchService是Java实现的一种I/O事件监视工具,它主要用于监听目录下文件的增加、删除、修改等事件。使用WatchService可轻松的对文件系统变化进行监视,通过检测文件事件,实现对文件系统的动态管理。本文主要介绍了WatchService的相关概念、WatchKey、WatchEvent的基本用法以及如何使用示例代码来实现。