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

时间:2018-02-22 03:18:41

标签: 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;
        }
   }

2 个答案:

答案 0 :(得分:2)

我猜,Oracle的监视服务不会检测远程事件 - 该服务是针对本地目录的。

您必须使用 - <style class='bar'>类API -

org.apache.commons.io.monitor.FileAlterationMonitor

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

答案 1 :(得分:1)

我遇到同样的问题,并使用了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();

    }