【发布时间】:2012-12-14 12:10:25
【问题描述】:
简介
我需要在文件系统子树上创建一个迭代器(例如,一个迭代器,给定一个文件夹,以深度优先搜索的顺序返回其中包含的所有文件,每个 next 方法调用一个)。
子树的内容会随着时间而改变,例如有可能(并且很可能)在迭代仍在进行时,将创建新的子文件夹和文件,而一些现有的子文件夹和文件将被删除。
幸运的是,以下条件是可以接受的:
实现可以(但如果不这样做会更好)跳过新创建的文件(例如,在迭代开始后产生的文件)和文件夹(以及这些文件夹中的文件),甚至只是其中的一些,
-
实现可以(但如果不这样做会更好)列出已删除的文件(例如,不再存在但在迭代开始时存在的文件),甚至只是其中的一些。
动机
为了让您更好地了解这些决策背后的原因,我想简要介绍一下整个应用程序。
它是一个类似于生产者/消费者的应用程序。 Web 服务(生产者)会接受文件并将它们存储在本地文件系统中,位于子树层次结构中的某个位置。
另一个应用程序(消费者)将处理这些文件。每隔几分钟就会通过 CRON 定期调用它。启动时,它将爬取子树,查找所有文档,并将它们交给处理(如果相关,则交给另一个应用程序)。处理完文档后,它会从本地文件系统中删除。
问题是生产者和消费者会同时运行。此外,消费者应用程序的多个实例也可能同时运行。例如。当消费者爬取子树时,可能会创建新文档并删除现有文档。甚至子目录的结构也可能会被修改。
由于爬虫每隔几分钟就会定期启动,因此它是否会消耗当时可用的所有文档(尤其是在消费者运行时生成的文档)并不重要。唯一重要的是生成的文档最终被消费(具有相当小的延迟)。这就是上面列出的放松条件的来源。
可能的解决方案
我首先想到我会在启动时将子树的快照创建到内存中(例如要处理的文档列表),然后遍历它们。见my other post。但是层次结构可能非常大(甚至每几个小时处理数万个文档),我认为这种方法可能具有不可接受的性能要求(内存和速度)。
您将如何实现这样的迭代器?
非常感谢您的帮助,很抱歉这篇文章太长了。
【问题讨论】:
-
也许(非递归)只复制您所在的子目录?
-
@bowmore:不,不幸的是,必须实现 Java 1.5 的兼容性。不过,我也会很感激关于如何在 Java 1.7 中解决这个问题的建议(出于好奇和学习)。
-
@bowmore 在 Java 7 中这很容易。 java.nio.file.FileSystem.getRootDirectories() + java.nio.file.Path.iterator()。 Overview of the FileSystem API
-
@ignis 我知道,这就是我问的原因
-
@Dusan。另一个想法是使用数据库事务。
标签: java