【问题标题】:How do I create a monitor for a specific directory?如何为特定目录创建监视器?
【发布时间】:2009-10-09 14:39:15
【问题描述】:

在 Windows Vista 上使用 Java,我正在尝试为目录创建一种监视器,因此每次修改此目录(新、重命名、更新或删除文件)时都会触发一个进程。我尝试使用一个循环来执行此操作,该循环将在目录中执行 dir 并分析所有文件。但这非常耗费时间和内存,特别是当文件数量开始增长时。我认为应该有更好的方法来做到这一点。

注意:在 SO 中有一个 similar question 用于此,但它适用于 C#。

【问题讨论】:

    标签: java windows directory monitor


    【解决方案1】:

    我认为应该有更好的方法 这样做。

    你说得对,Java 7 应该有更好的方法。请参阅即将发​​布的WatchService API

    如果没有 RC 版本,我不知道是否有一种可移植的方式来执行您所描述的操作。

    【讨论】:

      【解决方案2】:

      如果您等不及 Java 7 和 WatchService,您将不得不这样做:

      final File watched = new File("[path of directory to watch]");
      long lastModified = watched.lastModified();
      while(true) {
          if (watched.lastModified() > lastModified) {
              // Change happened in the directory do what you want.
          }
          Thread.sleep(2000); // 2 second interval
      }
      

      【讨论】:

      • 您的解决方案看起来比我目前使用的更好。我会在没有 Java 7 的时候尝试一下。
      • 您必须处理我的代码中可能引发的一些异常。 Thread.sleep() 和 IO 操作可以抛出异常。
      • 我自己喜欢 TimeUnit.SECONDS.sleep(2)
      • 你应该在 if 语句中设置 lastMofidied =watched.lastModified 否则语句在第一次更改后始终为真
      • @MartinDürrmeier 同意,这是一个错误,人们应该小心这段代码。
      【解决方案3】:

      您到底在监控什么?我希望您只需要监视目录的修改时间,然后如果目录已被修改,则检查文件的修改时间。

      所以我希望存储文件名与修改时间的Map(至少用于检查)。

      不幸的是,除了以某种能力轮询目录之外,没有一种简单 方法可以使用 Java 检查目录是否有更改。请参阅a previous answer of mine wrt。这个问题和你可以用来简化它的库(加上 Java 7 特性)

      【讨论】:

        【解决方案4】:

        您可能需要使用 JNI 来调用 ReadDirectoryChangesW。您可以改用 FirstFirstChangeNotification 和 FindNextChangeNotification,但除非您需要与旧(16 位)版本的 Windows 兼容,否则我建议您不要这样做。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-15
          相关资源
          最近更新 更多