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

时间:2009-06-23 11:16:30

标签: java directory

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

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

7 个答案:

答案 0 :(得分:4)

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

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

请参阅File.lastModified()

编辑:自从我写了上面的内容之后,Java 7就推出了directory watching capability

答案 1 :(得分:3)

此处列出了possible solutions和简单File/Folder Watcher的示例。

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

我不知道这是否有用,但是here's一个人对这个问题有所了解。

听起来.NET内置了一些内容:FileSystemWatcher

更新:感谢kd304,我刚刚了解到Java 7将拥有same feature。除非你可以使用preview release

,否则今天对你不会有好处

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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

您使用文件集合提供以下方法(例如,通过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<File> 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();
}

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