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();
}
}
}
Khi tôi chạy này và sau đó mở Notepad ++ và sau đó tạo ra một tập tin rỗng mới và lưu nó như a.txt
trong thư mục C:\tmp\
tôi có kết quả:Tại sao WatchService tạo ra quá nhiều hoạt động?
1: File a.txt is created!
2: File a.txt is deleted!
3: File a.txt is created!
Tại sao vậy? Dường như tệp đã được tạo và sau đó bị xóa và sau đó được tạo lại. Tại sao?
Khi tôi đặt một số văn bản trong các tập tin và lưu nó đầu ra là:
4: File a.txt is changed!
5: File a.txt is changed!
Tại sao nó thay đổi hai lần?
Tôi nghĩ rằng hành vi bạn nhìn thấy với WatchService là do cách Notepad ++ và một số mở rộng cách hệ điều hành Windows hoạt động khi thực hiện các hoạt động IO. Tôi đã thấy rằng một cái gì đó giống như "notepad" Windows tiêu chuẩn thường tạo ra hành vi mong đợi nhất. Tôi nghi ngờ rằng nếu bạn sử dụng Process Explorer (http://technet.microsoft.com/en-gb/sysinternals/bb896653.aspx) để theo dõi hoạt động IO ở cấp hệ điều hành, bạn sẽ thấy kết quả tương tự. –
Điều này có thể là do việc ghi nội dung và siêu dữ liệu được thực hiện riêng. – afk5min