Java 7 NIO watchservice vs jpathwatch

mja*_*ash 8 java nio watchservice nio2

我正在使用的项目一直在使用Java 6和jpathwatch(.95),现在正在升级到Java 7.目前在Windows 7和2008 Server上.我正在重构代码区域以使用新的Java 7 NIO并且相对简单 - 甚至使用NIO.2来替换jpathwatch.但是,我们代码的文件监视区域开始无法进行单元测试.似乎Java 7 NIO不会获取UNC路径到其他机器的变化 -

\\otherMach\path\to\watch.  
Run Code Online (Sandbox Code Playgroud)

为了测试,我实现了Java NIO教程站点http://docs.oracle.com/javase/tutorial/essential/io/fileio.html中的代码,然后在jpathwwatch导入而不是Java NIO中创建了一个重复的类交换.进口.jpathwatch适用于UNC路径,但Java NIO不适用.它似乎注册甚至返回该位置的初始事件键:(示例输出)

INFO: Watching: \\otherMach\path\to\watch
DEBUG: Added: \\otherMach\path\to\watch
INFO: Got event key: sun.nio.fs.WindowsWatchService$WindowsWatchKey@1f26ecd2
INFO: event key for: \\otherMach\path\to\watch
Run Code Online (Sandbox Code Playgroud)

但后来从未发现任何进一步的变化.

jpathwatch注册并报告目录和文件事件(尽管它在注册后不会立即报告初始事件).

INFO: Watching: \\otherMach\path\to\watch
DEBUG: Added: \\otherMach\path\to\watch
INFO: Got event key: name.pachler.nio.file.impl.WindowsPathWatchService$WatchRecord@79a7bd3b
INFO: event key for: \\otherMach\path\to\watch
INFO: EVENT RECEIVED: ENTRY_CREATE file/dir created - \\otherMach\path\to\watch\New folder
INFO: Got event key: name.pachler.nio.file.impl.WindowsPathWatchService$WatchRecord@79a7bd3b
INFO: event key for: \\otherMach\path\to\watch
INFO: EVENT RECEIVED: ENTRY_CREATE file/dir created - \\otherMach\path\to\watch\New Text Document.txt
Run Code Online (Sandbox Code Playgroud)

尽管在jpathwatch讨论中看到网络观看不受支持 - 请注意Uwe Pachler对UNC路径的回应 - http://sourceforge.net/p/jpathwatch/discussion/888207/thread/8ea778de/?limit=25# 0037

有没有人看过UNC路径和Java 7 NIO.2有什么好运?还有其他更近期的解决方案?

谢谢,

-mjash

小智 0

如果您使用 Oracle 文档中关于 WatchEvent 的教程和示例,您可能会错过在处理事件后调用 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;
        }
    }
Run Code Online (Sandbox Code Playgroud)