捕获目录中发生的事件

  • 本文关键字:事件 java watchservice
  • 更新时间 :
  • 英文 :


我使用以下方法监视使用Java 7 nio WatchService的目录。

Path myDir = Paths.get("/rootDir");
try {
  WatchService watcher = myDir.getFileSystem().newWatchService();
  myDir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE, 
  StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
  WatchKey watckKey = watcher.take();
  List<WatchEvent<?>> events = watckKey.pollEvents();
  for (WatchEvent event : events) {
    if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
      System.out.println("Created: " + event.context().toString());
      JOptionPane.showMessageDialog(null,"Created: " + event.context().toString());
    }
    if (event.kind() == StandardWatchEventKinds.ENTRY_DELETE) {
      System.out.println("Delete: " + event.context().toString());
      JOptionPane.showMessageDialog(null,"Delete: " + event.context().toString());
    }
    if (event.kind() == StandardWatchEventKinds.ENTRY_MODIFY) {
      System.out.println("Modify: " + event.context().toString());
      JOptionPane.showMessageDialog(null,"Modify: " + event.context().toString());
    }
  }
} catch (Exception e) {
  System.out.println("Error: " + e.toString());
}

但是上述方法仅在观察程序不响应该文件夹中发生的事件后,仅在目录中发生的一个事件中响应。有没有办法修改它以捕获文件夹中发生的所有事件。我还想修改它以捕获子文件夹中发生的事件。有人可以帮我吗?

谢谢。

来自 WatchService 的 JavaDoc :

Watchable 对象通过调用其注册方法向监视服务注册,并返回一个 WatchKey 来表示注册。当检测到对象的事件时,将发出密钥信号,如果当前未发出信号,则会将其排队到监视服务,以便调用轮询或采用方法来检索键和处理事件的使用者可以检索它。处理完事件后,使用者调用密钥的 reset 方法来重置密钥,从而允许向密钥发出信号并使用更多事件重新排队。

您只呼叫watcher.take()一次。

要监视进一步的事件,您必须在消耗WatchEvent s后拨打watchKey.reset()

while (true) {
  WatchKey watckKey = watcher.take();
  List<WatchEvent<?>> events = watckKey.pollEvents();
  for (WatchEvent event : events) {
    // process event
  }
  watchKey.reset();
}

另请查看 Java 教程的相关部分。

使用 Apache Commons IO 文件监控
它还将捕获子文件夹中发生的事件

import java.io.File;
import java.io.IOException;
import org.apache.commons.io.monitor.FileAlterationListener;
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
public class Monitor {
    public Monitor() {
    }
    //path to a folder you are monitoring .
    public static final String FOLDER = MYPATH;

    public static void main(String[] args) throws Exception {
        System.out.println("monitoring started");
        // The monitor will perform polling on the folder every 5 seconds
        final long pollingInterval = 5 * 1000;
        File folder = new File(FOLDER);
        if (!folder.exists()) {
            // Test to see if monitored folder exists
            throw new RuntimeException("Directory not found: " + FOLDER);
        }
        FileAlterationObserver observer = new FileAlterationObserver(folder);
        FileAlterationMonitor monitor =
                new FileAlterationMonitor(pollingInterval);
        FileAlterationListener listener = new FileAlterationListenerAdaptor() {
            // Is triggered when a file is created in the monitored folder
            @Override
            public void onFileCreate(File file) {
                    // "file" is the reference to the newly created file
                    System.out.println("File created: "+ file.getCanonicalPath());

            }
            // Is triggered when a file is deleted from the monitored folder
            @Override
            public void onFileDelete(File file) {
                try {
                    // "file" is the reference to the removed file
                    System.out.println("File removed: "+ file.getCanonicalPath());
                    // "file" does not exists anymore in the location
                    System.out.println("File still exists in location: "+ file.exists());
                } catch (IOException e) {
                    e.printStackTrace(System.err);
                }
            }
        };
        observer.addListener(listener);
        monitor.addObserver(observer);
        monitor.start();
    }
}

相关内容

  • 没有找到相关文章

最新更新