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();
}
}
}
내가 이것을 실행 한 다음 메모장을 열어 ++ 다음 새 빈 파일을 생성 I 출력 얻은 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에서 볼 수있는 동작은 메모장 + + 및 IO 작업 수행시 Windows 운영 체제의 작동 방식에 따라 다릅니다. "표준"Windows 메모장과 같은 것이 일반적으로 가장 기대되는 동작을 생성한다는 것을 발견했습니다. 프로세스 탐색기 (http://technet.microsoft.com/en-gb/sysinternals/bb896653)를 사용하면 의심 스럽습니다.aspx) OS 수준에서 IO 작업을 모니터링하려면 동일한 결과가 나타납니다. –
이것은 컨텐츠와 메타 데이터 쓰기가 개별적으로 수행되기 때문일 수 있습니다. – afk5min