如何在Java中获取具有最新lastModified日期的文件?

6

可能是重复问题:
如何在Java中查找目录中最后修改的文件?

我有一个文件目录需要检查是否发生更改。如果其中一个文件的modifiedDate比我上次检查时记住的时间要新,那么我就认为它已经被更改(这意味着这是一个缓存依赖项)。

在Java中查找目录中最新修改的文件的最快方法是什么?


也许我太乐观了,但我明确地寻找一些不涉及迭代所有文件的东西。
此外,检查目录修改日期是不够的,因为这只有在内部文件列表更改时才会更改,而不是当其中一个文件本身被修改时。

Java代码是唯一修改这些文件的东西吗?(我不这么认为,但以防万一……) - Pablo Fernandez
@Pablo Fernandez:不,是用户将新内容放在那里。 - Tomalak
嗯...也许可以通过事件驱动的IO来解决。不幸的是,我对此并不是专家,但希望这能给任何专家提供一些提示 :). 祝好运! - Pablo Fernandez
4个回答

2
即使您不想迭代所有文件,任何第三方API在查找时都会迭代所有文件。JDK 7旨在拥有java.nio.WatchService,如果必须,它将显然遍历所有内容,但会使用文件系统支持来执行您所要求的操作。缺点是,这仍然是未来的事情。请参考此链接

我已经这么想了。我猜这就是我最终要做的事情。 - Tomalak
其实,未来有一些闪亮的东西。让我编辑我的答案。 - Dean J
感谢您的编辑。:-) PS:类似这样的操作在.NET中已经可以通过System.IO.FileSystemWatcher实现。 - Tomalak
我非常期待JDK 7 - 如果它真的完成的话。因为Java在一些C#开发者现在认为理所当然的事情上需要赶上。 - Dean J

1

我不确定我是否正确理解了这个解决方案:基本操作是“获取每个文件,查看其日期”。这些操作的速度不比传统循环要快。所以速度的提高来自于即时排序吗? - Tomalak
你说得对。这个方法并没有比循环更快,但是它只有一个循环。任何其他可移植的解决方案(纯Java,不逃避特定于操作系统的命令等)都需要一个循环来获取所有文件,然后再循环一次以获取最后修改的文件。这个方法通过将逻辑放在第一个循环中来避免了第二个循环,从而节省了时间。 - rahulmohan
谢谢澄清。 :) 然而,说实话:这个特定的解决方案是为 ColdFusion 上下文设计的,它运行在 Java 之上。你可以在 ColdFusion 中操作 Java 对象,但是无法实现接口或任何其他高级功能。我不想为这个问题编写自己的 Java 类,所以我只留下了“做两个循环”的方法。现在已经足够好了。PS:在评论中使用 @ 回复,否则你的回复可能会被忽视。(只有在某人自己的帖子上发表评论,比如我在你的答案上发表评论,不需要 @ 回复。) - Tomalak

1
你必须迭代所有文件名并提取修改日期。

0

我认为这是不可能的。您可以使用Runtime类从Java中执行Unix命令行“ls -lrt | tail -1”,并解析字符串以获取最新修改文件的名称。


我指的是在不遍历目录中的所有文件对象的情况下无法引用。 - zoomer.hammerball
如果你有几千个文件(而且某一天可能会有),这不是一个好主意。 - darpet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接