我正在做的项目一直在使用Java 6和jpathwatch(.95(,现在正在升级到Java 7。目前在 Windows 7 和 2008 服务器上。我正在重构代码区域以使用新的Java 7 NIO,并且相对简单 - 甚至使用NIO.2来取代jpathwatch。但是,我们代码的文件监视区域开始失败单元测试。Java 7 NIO 似乎不会接受其他机器的 UNC 路径更改 -
\otherMachpathtowatch.
为了进行测试,我实现了Java NIO教程站点 http://docs.oracle.com/javase/tutorial/essential/io/fileio.html 的代码,然后在jpathwwatch导入而不是Java NIO导入中创建了一个重复的类交换。 jpathwatch适用于UNC路径,但Java NIO不适用于。它似乎注册甚至返回该位置的初始事件键:(示例输出(
INFO: Watching: \otherMachpathtowatch
DEBUG: Added: \otherMachpathtowatch
INFO: Got event key: sun.nio.fs.WindowsWatchService$WindowsWatchKey@1f26ecd2
INFO: event key for: \otherMachpathtowatch
但随后从未认识到任何进一步的变化。
jpathwatch 注册并报告目录和文件事件(尽管它不会在注册后立即报告初始事件(。
INFO: Watching: \otherMachpathtowatch
DEBUG: Added: \otherMachpathtowatch
INFO: Got event key: name.pachler.nio.file.impl.WindowsPathWatchService$WatchRecord@79a7bd3b
INFO: event key for: \otherMachpathtowatch
INFO: EVENT RECEIVED: ENTRY_CREATE file/dir created - \otherMachpathtowatchNew folder
INFO: Got event key: name.pachler.nio.file.impl.WindowsPathWatchService$WatchRecord@79a7bd3b
INFO: event key for: \otherMachpathtowatch
INFO: EVENT RECEIVED: ENTRY_CREATE file/dir created - \otherMachpathtowatchNew Text Document.txt
尽管在 jpathwatch 讨论中看到不支持网络观看 - 注意 Uwe Pachler 引用 UNC 路径的响应 - http://sourceforge.net/p/jpathwatch/discussion/888207/thread/8ea778de/?limit=25#0037
有没有人有幸观看UNC路径和Java 7 NIO.2?还有其他或更新的解决方案吗?
谢谢
-姆贾什
看起来这是JDK中的一个错误,该错误已在JDK 1.7.0_u60中修复。我刚刚尝试了 u71(一直在使用 u45(并验证它现在对我跨 UNC 有效。
如果您使用的是 WatchEvent 上的 Oracle 文档中的教程和示例,则在处理事件后可能会错过调用 key.reset((。我刚刚遇到了同样的问题:
void processEvent(){
for(;;){
WatchKey key;
try {
key = this.watcher.take();
} catch (InterruptedException ex){
return;
}
for(WatchEvent<?> event: key.pollEvents()){
WatchEvent<Path> newevent = (WatchEvent<Path>)event;
Path filepath = newevent.context();
... clipped ....
}
boolean valid = key.reset();
if(!valid){
break;
}
}
关于 UNC 路径和远程文件系统的明确描述,但这是我发现的:
起初,似乎可以注册监视键,但监视键立即失效(WatchKey.isValid()
(。
由于与文件系统的直接连接,因此无法将监视密钥注册到远程位置。
可能的解决方法:
1. 远程文件观察器
共享要监视的路径列表到远程 jvm,并让它将更改转发到您的计算机。
2. 轮询
另一种解决方法是轮询器(只有在时间紧迫的情况下才可推荐(。
如果您不断轮询,这将导致大量网络流量。
注册到远程路径时获得异常,或者至少在When to Use and Not Use This API
部分中阅读该异常。