Java Watch 服务:不适用于安装在本地服务器中的远程文件

Ian*_*the 9 java watchservice

我有 Java 程序监视安装在本地服务器上的远程文件夹。但只要远程文件夹中的某些内容发生更改,它就不会检测到任何更改/修改。

如果在安装的文件夹中进行了更改/修改,则工作正常。

通过网络搜索,如 Java 文档中所述

如果监视的文件不在本地存储设备上,那么是否可以检测到文件的更改是实现特定的。特别是,不需要检测在远程系统上执行的文件更改。

任何人都可以帮助我提供有关如何执行此操作的示例?下面是我当前的代码

WatchService watcher = FileSystems.getDefault().newWatchService();
    Path dir = Paths.get(directory);
    dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);

    while (true) {

        WatchKey key;
        try {
            key = watcher.take();
        } catch (Exception ex) {
            return;
        }

        for (WatchEvent<?> event : key.pollEvents()) {
            WatchEvent.Kind<?> kind = event.kind();

            @SuppressWarnings("unchecked")
            WatchEvent<Path> ev = (WatchEvent<Path>) event;
            Path fileName = ev.context();

            if (kind == ENTRY_MODIFY) {
                    System.out.println("file has changed");
                   // other process    
            }
           if (kind == ENTRY_CREATE) {
                  System.out.println("file has created");
                  // other process
           }
        }

        boolean valid = key.reset();
        if (!valid) {
            break;
        }
   }
Run Code Online (Sandbox Code Playgroud)

Sab*_*han 0

我猜想,Oracle 的监视服务不会检测远程事件 - 该服务适用于本地目录。

你必须使用 - org.apache.commons.io.monitor.FileAlterationMonitorAPI 类 -

<dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

您应该在 google 上搜索使用该类的代码示例。

  • 这不是甲骨文的错。问题在于远程文件系统协议(例如 NFS、SMB)不允许您在远程文件服务器上安装观察程序,并且无法将(所有)文件事件传递给感兴趣的客户端。因此,观看在客户端操作系统中不起作用。Java 代码依赖于操作系统。 (2认同)