import java.io.*;
import java.nio.file.*;
public class Tmp {
public static void main(String [] args) throws IOException {
int count = 0;
Path path = Paths.get("C:\\tmp\\");
WatchService ws = null;
try {
ws = FileSystems.getDefault().newWatchService();
path.register(ws, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE,
StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.OVERFLOW);
} catch (IOException ioe) {
ioe.printStackTrace();
}
while(true) {
WatchKey key = null;
try {
key = ws.take();
} catch(InterruptedException ie) {
ie.printStackTrace();
}
for(WatchEvent<?> event: key.pollEvents()) {
switch(event.kind().name()) {
case "OVERFLOW":
System.out.println(++count + ": OVERFLOW");
break;
case "ENTRY_MODIFY":
System.out.println(++count + ": File " + event.context() + " is changed!");
break;
case "ENTRY_CREATE":
System.out.println(++count + ": File " + event.context() + " is created!");
break;
case "ENTRY_DELETE":
System.out.println(++count + ": File " + event.context() + " is deleted!");
break;
default:
System.out.println(++count + ": UNKNOWN EVENT!");
}
}
key.reset();
}
}
}
私はこれを実行し、その後、私は出力を得C:\tmp\
ディレクトリにメモ帳++を開設し、新しい空のファイルを作成し、a.txt
としてそれを保存:なぜWatchServiceは非常に多くの操作を生成しますか?
1: File a.txt is created!
2: File a.txt is deleted!
3: File a.txt is created!
それはなぜですか?ファイルが作成されてから削除され、再度作成されたようです。どうして?私は、ファイル内のテキストを入れて、それに出力を保存し
た:
4: File a.txt is changed!
5: File a.txt is changed!
なぜそれが二回に変更しましたか?
WatchServiceで見られる動作は、Notepad ++と、IO操作を実行する際にWindowsオペレーティングシステムが動作する方法を拡張しているためです。私は、 "標準の" Windowsのメモ帳のようなものが、通常、最も期待される動作を生成することを発見しました。私はProcess Explorer(http://technet.microsoft.com/en-gb/sysinternals/bb896653)を使用すると思われます。aspx)を使用してOSレベルでIOアクティビティを監視すると、同じ結果が表示されます。 –
これは、コンテンツとメタデータの書き込みが別々に実行されるためです。 – afk5min