Java中File.exists()的替代方案

我从未想过它会发生在我身上,但我遇到了我在Java中的第一个错误:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5003595

我几乎和bug中描述的情况一样(在Linux上的NFS),我发现File.exists()没有返回正确的值(至少不是马上)。

所以我的问题是,有没有替代这种检查文件是否存在的方法? 如果可能的话,我宁愿保持操作系统不可知。

编辑:我找到了一个解决方法。 如果你调用’ls $ filedir’,NFS会刷新任何给Java带来麻烦的缓存/元数据,而File.exists()会返回正确的值。 当然,这并不完全理想,因为它会损害可移植性,但有办法解决这个问题。

谢谢,-Ben

NFS的基本问题是它缓存属性,文件和目录信息。 这意味着信息可能已过时。 您可能能够关闭缓存,您将看到性能显着下降。

需要记住的重要一点是,NFS不是一种消息传递服务,并不是为及时传送数据而设计的。

我遇到了同样的问题,并通过调用file.getParentFile().list()解决了这个问题。 与您的解决方案基本相同,但操作系统不可知。

如果File.exists()返回true会发生什么,然后有人删除文件/您的NFS挂载消失,然后您尝试打开文件? 基本上, File.exists()是无用的,因为您需要处理因打开文件而产生的exception。

所有File.exists告诉您文件是否存在于过去的某个时刻。 它没有告诉你:

  • 当您尝试打开它时是否存在
  • 您是否有权打开它
  • 什么都有用,真的

因此,尝试设计您的应用程序,以便它可以处理不存在的文件,而无需提前检查。 (实际使用该文件时,您必须处理各种exception。)

我注意到Java 7的java.nio.file.Path.exists()方法在文件不存在或无法确定存在时返回false。 因此,似乎假阴性会持续一段时间,并且您的代码需要容忍它们。

显而易见的替代方法是File.isFile()。 先尝试一下。

虽然在读取只读文件时它会变得不准确,但您始终可以使用File.canWrite()来检查文件是否存在。

如果上述两种方法都失败,您可以使用File.length()。 如果它返回0L,则表示该文件不存在。