0

介绍

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

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

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

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

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


动机

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

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

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

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

因为爬虫每隔几分钟就会定期启动,所以它是否消耗了当时所有可用的文档(尤其是那些在消费者运行时产生的文档)并不重要。唯一重要的是生成的文档最终被消费(具有相当小的延迟)。这就是上面列出的放松条件的来源。


可能的解决方案

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


你将如何实现这样的迭代器?


非常感谢您的帮助,并为这篇文章的篇幅过长感到抱歉。

4

1 回答 1

0

由于您不能直接使用 JDK 7,您仍然可以看看他们是如何做到的:FileTreeWalker

于 2012-12-14T12:24:34.330 回答