【发布时间】:2016-05-01 23:28:18
【问题描述】:
问题描述
我想观察一个完整的文件系统的变化。我说的是递归地观察目录中的变化。因此,在查看目录(或整个文件系统)时,也需要捕获子目录中的所有更改。应用程序需要能够通过收到通知来跟踪所有更改。
Java 的 WatchService 不适合
Java 已经有了has 一个WatchService 功能,它允许您监视目录的更改。然而问题是,据我所知,这不是一个递归过程,因此您不能使用它来监视文件系统根目录中的所有更改。
明确查看所有子目录
我想到的一个解决方案是在指定的根目录中显式注册每个目录。然而,这样做的问题是,在具有超过一百万个子目录的系统上,遍历和注册这些目录是非常昂贵的资源。这是因为系统需要递归地遍历整个文件系统才能首先注册所有目录。此功能对性能的影响太大了,如果它甚至可以不使应用程序崩溃的话。
逻辑解决方案
我会假设操作系统会在文件系统上发生任何更改时触发/调用某种事件,应用程序能够侦听。但是,我确实没有找到类似的东西。这将允许应用程序监听所有更改,而无需显式注册所有子目录。因此,这种方法对性能的影响将是最小的。
问题
在 Java 中是否可以查看整个文件系统或递归查看目录,这将如何实现?
【问题讨论】:
-
您提到的副本似乎只指向
WatchService。这个问题是关于一般看文件系统的,提到的WatchService只是为了覆盖一个不合适的方法。 -
我会说这对于具有数百万个子目录的目录来说可能是不可能的。至少不是在 Linux 上,这种监控是由
inotify完成的,对于reasons given on Quora by the author,这不是递归的。
标签: java recursion filesystems watch watchservice