我正在尝试编写一个java程序,如果在文件C:/xampp/apache/logs/access.log中出现新条目,则会响应,以识别对我的Apache服务器的新请求。
我使用了以下代码:
public static void monitor() throws IOException {
WatchService watcher = FileSystems.getDefault().newWatchService();
File file = new File("C:/xampp/apache/logs/");
Path dir = file.toPath();
dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY, OVERFLOW);
for (;;) {
// wait for key to be signaled
WatchKey key;
try {
key = watcher.take();
} catch (InterruptedException x) {
return;
}
for (WatchEvent<?> event : key.pollEvents()) {
WatchEvent.Kind<?> kind = event.kind();
// get file name
@SuppressWarnings("unchecked")
WatchEvent<Path> ev = (WatchEvent<Path>) event;
Path fileName = ev.context();
System.out.println(kind.name() + ": " + fileName);
if (kind == OVERFLOW) {
continue;
} else if (kind == ENTRY_CREATE) {
System.out.println("entry created occured");
// process create event
} else if (kind == ENTRY_DELETE) {
// process delete event
} else if (kind == ENTRY_MODIFY && fileName.toString().equals("access.log")) {
System.out.println("entry modified occured");
// process modify event
}
}
// Reset the key -- this step is critical if you want to
// receive further watch events. If the key is no longer valid,
// the directory is inaccessible so exit the loop.
boolean valid = key.reset();
if (!valid) {
break;
}
}
}
但在手动打开文件之前,它无法识别access.log中的更改。我的代码有问题吗?
答案 0 :(得分:0)
有不同的选项。
有两个类似的问题,唯一的区别是他们想要检查整个目录而不仅仅是一个文件,但你可以调整代码来检测修改后的文件是否是你想要的文件
Watching a Directory for Changes in Java
Java detect changes in filesystem
对于我找到的特定解决方案
http://www.rgagnon.com/javadetails/java-0490.html
此代码启动一个检查文件的lastModified值的线程,如果它与前一个不同,则表示该文件已被修改。我不知道它是否非常有效,请查看它们。