Java监视服务:无法使用本地服务器挂载的远程文件

9
我有一个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;
        }
   }
2个回答

4

我有同样的问题,并使用了org.apache.commons.io.monitor.FileAlterationMonitor。如前面的帖子所建议的,pom.xml更改如下:

<dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
</dependency>

以下是我使用的可行的代码片段:

    String monitoringDirectory= "<YOUR CODE HERE>"; 
    FileAlterationObserver observer = new FileAlterationObserver(monitorDirectory);

    logger.info("Start ACTIVITY, Monitoring "+monitorDirectory);
    observer.addListener(new FileAlterationListenerAdaptor(){
         @Override
         public void onDirectoryCreate(File file) {
            logger.info("New Folder Created:"+file.getName());
         }

         @Override
         public void onDirectoryDelete(File file) {
             logger.info("Folder Deleted:"+file.getName());
         } 

         @Override
         public void onFileCreate(File file) {
             logger.info("File Created:"+file.getName()+": YOUR ACTION");

         }

         @Override
         public void onFileDelete(File file) {
             logger.info("File Deleted:"+file.getName()+": NO ACTION");
         }  
      });
    /* Set to monitor changes for 500 ms */     
    FileAlterationMonitor monitor = new FileAlterationMonitor(500, observer);
    try {
        monitor.start();
    } catch (Exception e) {
        logger.error("UNABLE TO MONITOR SERVER" + e.getMessage());
        e.printStackTrace();

    }

你在这个变量里放了什么?字符串监控目录=“<YOUR CODE HERE>”; 这是服务器IP和文件夹位置吗?如果需要凭据才能访问该文件夹怎么办? - user666
如果您查看问题:“Java程序监视在本地服务器上挂载的远程文件夹”,则此处文件夹的挂载和所需权限超出了应用程序的范围。它假定该文件夹可以作为共享文件夹访问。“YOUR CODE HERE”是应用程序可以读取的文件夹的位置。 - pradosh nair

0

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

您需要使用API的org.apache.commons.io.monitor.FileAlterationMonitor类 -

<dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
</dependency>

你应该谷歌搜索使用该类的代码示例。


2
这并不是Oracle的错。问题在于远程文件系统协议(例如NFS、SMB)不允许您在远程文件服务器上安装监视器,并且没有一种方法将(所有)文件事件传递给感兴趣的客户端。因此,在客户端操作系统中无法进行监视。Java代码依赖于操作系统。 - Stephen C
1
换句话说,如果你的文件监视器是用C实现的,你仍然会遇到同样的问题。 - Stephen C
1
该库不会连接到基于远程服务器文件夹的位置,参考:https://stackoverflow.com/questions/35217774/make-filealterationobserver-to-observe-remote-directory - user666
1
其他博客说甚至Apache Commons IO也无法使用远程文件夹。那么除了创建一个定期检查文件夹的线程之外,还有什么解决办法呢? - user666
1
@user666:你说得对,它是基于时间间隔的,但你可以将间隔设置得非常低,以获得实时感觉。这就是所有程序的工作方式,即使让持续时间足够短,人类也无法察觉到任何真正的实时性。其次,此解决方案适用于挂载在本地服务器上的远程目录。挂载的另一个词是 Windows 上的映射驱动器。如果通过 SSH、FTP、SFTP、HTTP 等访问远程目录,则此解决方案不适用。 - Sabir Khan
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接