0

Pro Java 7 NIO.2 Page No 118の小さなプログラムを試しています

コードは次のとおりです。

class WatchRafaelNadal {
    public void watchRNDir(Path path) throws IOException, InterruptedException {
        try (WatchService watchService = FileSystems.getDefault().newWatchService()) {
           path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE,
                StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE);

                //start an infinite loop
                while (true) {
                //retrieve and remove the next watch key
                final WatchKey key = watchService.take();
                //get list of pending events for the watch key
                for (WatchEvent<?> watchEvent : key.pollEvents()) {

                //get the kind of event (create, modify, delete)
                final Kind<?> kind = watchEvent.kind();
                //handle OVERFLOW event
                if (kind == StandardWatchEventKinds.OVERFLOW) {
                continue;
                }
                //get the filename for the event
                final WatchEvent<Path> watchEventPath = (WatchEvent<Path>) watchEvent;
                final Path filename = watchEventPath.context();
                //print it out
                System.out.println(kind + " -> " + filename);
                }
                //reset the key
                boolean valid = key.reset();
                //exit loop if the key is not valid (if the directory was deleted, for example)
                if (!valid) {
                break;
                }
           }
       }
    }
}

public class Main {
     public static void main(String[] args) {
        final Path path = Paths.get("C:/Java");
            WatchRafaelNadal watch = new WatchRafaelNadal();
            try {
            watch.watchRNDir(path);
            } catch (IOException | InterruptedException ex) {
            System.err.println(ex);
            }
        }
}

しかしglobal.properties、フォルダーに存在する(または任意のファイル)の行を変更すると、次のC:\\Javaように出力されます-

 ENTRY_MODIFY  -> global.properties
 ENTRY_MODIFY  -> global.properties

なぜイベントを2回発生させるのですか?
ファイル内の正確に変更された行を検出するために Java で利用できるサービスはありますか?

JDK : jdk1.7.0_09
IDE : Eclipse Java EE IDE バージョン : Juno リリース
プラットフォーム : Windows 7

4

1 に答える 1

3

ファイルをどのように変更しましたか?

技術にファイルを 2 回変更した可能性があります。

たとえば、最初にコンテンツが変更され、次にファイルのメタデータが更新され、2 つのイベントが作成されます。

このような状況を処理できるようにアプリケーションを実装するのがおそらく最善です。

于 2012-12-22T11:22:30.727 に答える