Java 如何快速查找添加/删除的文件?
我正在写一个小程序,创建我目录中所有文件的索引。它基本上迭代磁盘上的每个文件,并将其存储到可搜索的数据库中,很像Unix的locate。问题是,索引生成相当慢,因为我有大约一百万个文件 生成索引后,是否有一种快速方法可以确定自上次运行以来磁盘上添加或删除了哪些文件 编辑:我不想监视文件系统事件。我认为失去同步的风险太高了,我更喜欢像快速重新扫描那样快速找到文件添加/删除的位置。可能是目录最后修改的日期还是什么 一个小基准 我只是做了一个小基准。运行Java 如何快速查找添加/删除的文件?,java,file,filesystems,Java,File,Filesystems,我正在写一个小程序,创建我目录中所有文件的索引。它基本上迭代磁盘上的每个文件,并将其存储到可搜索的数据库中,很像Unix的locate。问题是,索引生成相当慢,因为我有大约一百万个文件 生成索引后,是否有一种快速方法可以确定自上次运行以来磁盘上添加或删除了哪些文件 编辑:我不想监视文件系统事件。我认为失去同步的风险太高了,我更喜欢像快速重新扫描那样快速找到文件添加/删除的位置。可能是目录最后修改的日期还是什么 一个小基准 我只是做了一个小基准。运行 dir /b /s M:\tests\ &g
dir /b /s M:\tests\ >c:\out.txt
只需0.9秒,就能提供我需要的所有信息。当我使用Java实现()时,大约需要4.5秒。有没有办法至少改进这种暴力手段
相关帖子:不幸的是,java中没有标准的方法来监听文件系统事件。这可能会出现在java7中
现在,您必须搜索“java文件系统事件”,并选择与您的平台匹配的自定义实现。加快速度的一种方法是,只需迭代目录并检查上次修改的时间,以查看自上次索引以来目录的内容是否发生了更改,如果他们只是在目录上做了一个普通的扫描,然后看看你是否能找到变化的地方。我不知道它的可移植性有多好,但它改变了层次结构,在Linux系统上传播(可能依赖于文件系统),因此您可以从根目录开始,然后向下运行,当您找到一个未更改的目录时停止运行。文件日期方法可能不是最好的方法。例如,如果从备份中还原文件。也许在索引期间,您可以存储文件内容的MD5散列。但是,您可能需要进行一些性能基准测试,看看性能是否可以接受我听说这项任务很难有效完成。我相信微软如果简单的话也会实现类似于Windows的工具,特别是在HD:s不断增长的今天。我还没有检查实现或性能,但commons io有一个方法。这可能值得一试。鉴于我们不想监视文件系统事件,我们是否可以跟踪每个文件的
(名称、大小、时间、校验和)
?文件校验和(或加密哈希,如果您愿意)的计算将成为瓶颈。您可以在初始运行时只计算一次,然后仅在以后需要时(例如,当文件与其他三个属性匹配时)重新计算。当然,如果我们只想跟踪文件名,而不想跟踪文件内容,就不必为此费心了
您提到,与“dir/s
”相比,您的Java实现(类似于)非常慢。我认为有两个原因:
"dir /b /s M:\tests\"
如果这将用于正在运行的应用程序(而不是作为一个独立的应用程序),您可以将JVM的“预热”时间打折,这大约是1-2秒,具体取决于您的硬件
您可以尝试一下,看看它有什么影响。我已经在我的工具MetaMake中完成了这项工作。以下是菜谱:
"dir /b /s M:\tests\"
dir /b /s /on M:\tests\
dir /b /s /on m:\tests >new.txt
diff new.txt archive.txt >diffoutput.txt
del archive.txt
ren new.txt archive.txt