在Java中跟踪文件夹更改的最简单方法是什么?

我有一组源文件夹。 我使用Java类从这些文件夹中构建分发文件。 我想在Java中编写另一个小类,每半秒运行一次,检查文件夹中的任何文件是否已更改,如果是,则运行构建类。

那么,如何轻松检测文件夹已被修改?

我认为您需要检查目录和子目录修改时间(对于要添加/删除的文件)和文件修改时间(对于每个文件中的更改)。

编写一个递归例程,检查目录是否有修改时间,是否已更改,以及每个文件。 然后检查目录内容,并递归调用任何子目录。 您应该能够检查比上次运行检查时更大的修改时间。

请参见File.lastModified()

编辑:自从我上面写了以后,Java 7出现了它的目录监视function 。

这里列出了可能的解决方案和简单文件/文件夹观察器的示例。

如果您可以使用Java 7,则它支持与平台无关的目录/文件更改通知。

JNA有一个跨平台变更通知示例。 不确定你会发现它有多容易。

我不知道这有什么好处,但这是一个人对这个问题的看法。

听起来像.NET有内置的东西: FileSystemWatcher

更新:感谢kd304,我刚刚了解到Java 7将具有相同的function 。 除非您可以使用预览版 ,否则今天对您不会有太大帮助。

您需要观察每个文件并跟踪File.lastModified属性并检查File.exists标志以及一些简单的递归来遍历目录结构。

使用NIO2(Java7)它将非常容易。 使用Java6,您可以调用list()并与之前的列表进行一次比较吗? (一个看着服务的穷人)

是的,目录中有许多可用的侦听器,但它们都相对复杂,而且大部分涉及线程。

几天前,我与我们的一位工程师进行了几乎激烈的讨论,讨论是否允许创建一个新的线程(在Web应用程序中)来监视目录树。 最后我和他达成了一致,但是由于想出了一些如此之快的东西,以至于没有必要听一听。 注意:下面描述的解决方案仅在您不需要知道哪个文件已更改,只知道文件已更改时才有效。

您使用文件集合提供以下方法(例如,通过Apache IO的FileUtils.listFiles()方法获得),这将返回集合的哈希值。 如果添加,删除任何文件或更改其修改日期,则哈希值将更改。

在我的测试中,在3Ghz Linux机器上,50K文件大约需要750毫秒。 触摸任何文件都会改变哈希值。 在我自己的实现中,我使用的是另一种哈希算法(DJB),但速度要快一些,但这就是它的要点。 我们现在只是存储哈希值并且每次都检查它是非常轻松的,特别是对于较小的文件集合。 如果有任何变化,我们会重新索引目录。 观察者的复杂性在我们的应用程序中是不值得的。

 /** * Provided a directory and a file extension, returns * a hash using the Adler hash algorithm. * * @param files the Collection of Files to hash. * @return a hash of the Collection. */ public static long getHash( Collection files ) { Adler32 adler = new Adler32(); StringBuilder sb = new StringBuilder(); for ( File f : files ) { String s = f.getParent()+'/'+f.getName()+':'+String.valueOf(f.lastModified()); adler.reset(); adler.update(s.getBytes()); sb.append(adler.getValue()+' '); } adler.reset(); adler.update(sb.toString().getBytes()); return adler.getValue(); } 

是的,还有改进的余地(例如,我们使用哈希方法而不是内联方法)。 以上内容是从我们的实际代码中删除的,但应该让您知道我们做了什么。