1

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());
}

ただし、上記の方法は、そのフォルダーで発生したイベントにウォッチャーが応答しなかった後、ディレクトリで発生した 1 つのイベントにのみ応答します。これを変更して、フォルダー内で発生するすべてのイベントをキャプチャする方法はありますか。また、これを変更して、サブフォルダーでも発生するイベントをキャプチャしたいと考えています。誰かがそれを手伝ってくれますか。

ありがとうございました。

4

2 に答える 2

5

の JavaDocWatchServiceから:

Watchable オブジェクトは、その register メソッドを呼び出すことによってウォッチ サービスに登録され、登録を表す WatchKey が返されます。オブジェクトのイベントが検出されると、キーが通知されます。現在通知されていない場合は、監視サービスのキューに入れられ、ポーリングを呼び出すか、メソッドを取得してキーを取得し、イベントを処理するコンシューマーがキーを取得できるようにします。イベントが処理されると、コンシューマーはキーのリセット メソッドを呼び出してキーをリセットします。これにより、キーにシグナルを送信し、さらなるイベントで再度キューに入れることができます。

呼び出しwatcher.take()は 1 回だけです。

watchKey.reset()さらなるイベントを監視するには、s を消費した後に呼び出す必要がありますWatchEvent。これらすべてをループに入れます。

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

Java チュートリアルの関連セクションも参照してください。

于 2013-10-30T09:29:42.297 に答える
3

Apache Commons IO File Monitoring を使用する
と、サブフォルダーで発生するイベントもキャプチャされます

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();
    }
}
于 2013-10-30T10:27:05.930 に答える