我有兴趣知道观察者模式是否是实现监视日志文件及其更改的代码的正确方法?
我目前正在使用它,但似乎有一个我无法解释的异常现象。基本上,我创建一个名为 FileMonitor 的类,它有一个触发的计时器,它迭代唯一文件的列表,查找更改的“最后修改日期”。
找到它后,将迭代侦听器列表以查找匹配的文件,并且它是
通知 fileChanged 事件。然后它开始处理添加到文件中的行。
因此,为了让我的问题更简洁:
- 观察者模式适合我想要做的事情吗? (现在
我每个文件有一个监听器)
- 鉴于有多个文件需要处理,是否存在“并发问题”的可能性
监视器?
Thanks
Java 7 引入了WatchService
它监视注册对象的更改和事件。
Watchable 对象通过调用其监视服务来注册
register方法,返回一个WatchKey来代表注册。
当检测到对象的事件时,按键会发出信号,并且如果
当前未发出信号,它会排队到监视服务,以便它
可以由调用 poll 或采取方法的消费者检索
检索密钥并处理事件。事件处理完毕后
消费者调用密钥的重置方法来重置密钥
允许密钥发出信号并与进一步的事件重新排队。
文件系统报告事件的速度可能比检索或检索事件的速度快
处理和实施可能会施加未指定的限制
它可能累积的事件数。哪里有实施
故意丢弃事件,然后安排键的 pollEvents
方法返回事件类型为 OVERFLOW 的元素。这个事件
消费者可以将其用作重新检查状态的触发器
物体。
例子 -
Path myDir = Paths.get("D:/test");
try {
WatchService watcher = myDir.getFileSystem().newWatchService();
myDir.register(watcher, StandardWatchEventKind.ENTRY_CREATE,
StandardWatchEventKind.ENTRY_DELETE, StandardWatchEventKind.ENTRY_MODIFY);
WatchKey watckKey = watcher.take();
List<WatchEvent<?>> events = watckKey.pollEvents();
for (WatchEvent event : events) {
if (event.kind() == StandardWatchEventKind.ENTRY_CREATE) {
System.out.println("Created: " + event.context().toString());
}
if (event.kind() == StandardWatchEventKind.ENTRY_DELETE) {
System.out.println("Delete: " + event.context().toString());
}
if (event.kind() == StandardWatchEventKind.ENTRY_MODIFY) {
System.out.println("Modify: " + event.context().toString());
}
}
} catch (Exception e) {
System.out.println("Error: " + e.toString());
}
}
参考 -link http://docs.oracle.com/javase/7/docs/api/java/nio/file/WatchService.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)