【问题标题】:Iterate over a subtree of a (mutable) filesystem迭代(可变)文件系统的子树
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-12-02
    • 2011-08-07
    • 2023-04-02
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    相关资源
    最近更新 更多