文件在Java中更改了监听器

che*_*g81 101 java file listener

我希望在文件系统中更改文件时收到通知.我找到的只是一个调查lastModified File属性的线程,显然这个解决方案不是最优的.

Ste*_*nne 112

我以前写了一个日志文件监视器,我发现轮询单个文件的属性(每秒几次)对系统性能的影响实际上非常小.

Java 7作为NIO.2的一部分添加了WatchService API

WatchService API专为需要通知文件更改事件的应用程序而设计.

  • 我看到示例是看目录,但个别文件怎么样? (10认同)

Tel*_*tar 39

我使用Apache Commons的VFS API,这是一个如何监视文件而不会对性能产生太大影响的示例:

DefaultFileMonitor


And*_*dré 27

有一个名为jnotify的lib 在linux 上包含inotify,并且还支持windows.从来没有使用它,我不知道它有多好,但值得一试,我会说.


Rut*_*ani 21

在低级别,对此实用程序进行建模的唯一方法是在目录上进行线程轮询并密切关注文件的属性.但是您可以使用模式为这样的实用程序开发适配器.

例如,像Tomcat这样的j2ee应用程序服务器具有自动加载功能,只要部署描述符更改或servlet类更改,应用程序就会重新启动.

您可以使用来自此类服务器的库,因为tomcat的大多数代码都是可重用的和开源的.

  • 这在Java 7中已不再适用:现在有一个API可以挂钩到操作系统的通知服务:http://blogs.oracle.com/thejavatutorials/entry/watching_a_directory_for_changes (56认同)
  • 该 API 过于复杂。如果强制您使用“无限”循环来实现/管理线程只是为了使用它。然后你必须留意所谓的“溢出”事件,这意味着你错过了一些东西,但谁知道是什么。它实际上“增加”了程序员的工作,因为本机目录更改通知通常具有过度杀伤力的好处(如果甚至受文件系统支持,否则它默认为内部轮询)。如果它遵循简单的侦听器模式,那就太好了。例如:WatchService.watch(File f, FileListener Listener),其中 f 可以是目录或文件。太糟糕了。 (2认同)

Chr*_*ian 8

Java commons-io有一个FileAlterationObserver.它与FileAlterationMonitor结合进行轮询.类似于公共VFS.优点是它具有更少的依赖性.

编辑:较少的依赖关系不是真的,它们对于VFS是可选的.但它使用java File而不是VFS抽象层.


Tom*_*ine 5

“更多 NIO 功能”具有文件监视功能,其实现取决于底层操作系统。应该在JDK7中。

更新:已添加到 Java SE 7。Chris Janicki 提供了相关 Java 教程链接


小智 5

每次我去读取属性文件时,我都会运行这段代码,只有在自上次读取文件以来它被修改过的情况下才真正读取该文件。希望这可以帮助某人。

private long timeStamp;
private File file;

private boolean isFileUpdated( File file ) {
  this.file = file;
  this.timeStamp = file.lastModified();

  if( this.timeStamp != timeStamp ) {
    this.timeStamp = timeStamp;
    //Yes, file is updated
    return true;
  }
  //No, file is not updated
  return false;
}
Run Code Online (Sandbox Code Playgroud)

Log4J 中使用了类似的方法FileWatchdog