在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(); }
是的,还有改进的余地(例如,我们使用哈希方法而不是内联方法)。 以上内容是从我们的实际代码中删除的,但应该让您知道我们做了什么。
- 使用父pom中的pluginManagement在eclipse中生命周期配置错误未涵盖插件执行
- 使用Executors服务在Java中创建固定大小线程池的最佳方法
- 如何扩展Selenium By.class以创建更多灵活性?
- java.lang.NoSuchMethodError:javax.persistence.JoinColumn.foreignKey
- SQLException:已用尽的结果集
- Spring MVC:如何修改从控制器发送的json响应
- Javagenerics和数组
- 将可填写的未来中的exception映射到不同的exception类型?
- 如何使用applet从java中的网络摄像头捕获video?