迭代(可变)文件系统的子树

时间:2012-12-14 12:10:26

标签: java

简介

我需要在文件系统子树上创建一个迭代器(例如,一个迭代器,给定一个文件夹,返回包含在其中的所有文件,按深度优先搜索顺序,每个next方法调用一个)

子树的内容可以随时间变化,例如有可能(并且很可能),当迭代仍在进行中时,将创建新的子文件夹和文件,并且将删除一些现有的子文件夹和文件。

幸运的是,以下条件是可以接受的:

  • 实现可以(但如果不这样做会更好)跳过新创建的文件(例如,迭代开始后发起的文件)和文件夹(以及这些文件夹中的文件),甚至只是其中的一部分,

  • 实现可以(但如果不这样做会更好)列出已删除的文件(例如,不再存在但在迭代开始时存在的文件),或者甚至只是其中一些文件。


动机

为了让您更好地了解这些决策背后的理由,我想简要介绍一下整个应用程序。

它是一个类似生产者/消费者的应用程序。 Web服务(生产者)将接受文件并将它们存储在子树层次结构中的本地文件系统上。

另一个应用程序(消费者)将处理这些文件。每隔几分钟就会通过CRON定期调用它。启动时,它会抓取子树,查找所有文档,然后将它们交给处理(如果相关,则转到另一个应用程序)。处理完文档后,它将从本地文件系统中删除。

问题是生产者和消费者会同时运行。此外,消费者应用程序的多个实例也可能同时运行。例如。当消费者抓取子树时,可能会创建新文档并删除现有文档。甚至子目录的结构也可能被修改。

由于爬虫每隔几分钟就会定期启动,因此它是否会消耗当时可用的所有文档(尤其是在消费者运行时生成的文档)并不重要。生成的文档最终被消耗(具有相当小的延迟)是很重要的。这就是上面列出的放松条件来自的地方。


可能的解决方案

我首先想到我会在启动时创建子树的快照到内存中(例如要处理的文档列表),然后迭代它们。见my other post。但层次结构可能非常大(甚至每几个小时处理数万个文档),我认为这种方法可能具有不可接受的性能要求(内存和速度)。


您如何实现这样的迭代器?


非常感谢你的帮助,并对这篇文章的篇幅很遗憾。

1 个答案:

答案 0 :(得分:0)

由于您无法直接使用JDK 7,您仍然可以看看他们是如何在那里完成的:FileTreeWalker