9

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

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

我几乎处于与错误(Linux 上的 NFS)中描述的完全相同的情况,并且我看到它File.exists()没有返回正确的值(至少不是马上)。

所以我的问题是,这种检查文件是否存在的方法有什么替代方法吗?如果可能的话,我更愿意让它与操作系统无关。

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

4

6 回答 6

7

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

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

于 2010-09-30T20:06:42.120 回答
7

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

于 2015-08-03T08:51:31.860 回答
6

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

于 2010-09-30T17:24:59.903 回答
5

一切都File.exists告诉您该文件是否在过去的某个时间点存在。它不会告诉你:

  • 尝试打开时是否存在
  • 是否有权限打开
  • 任何有用的东西,真的

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

于 2010-09-30T17:22:48.270 回答
3

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

于 2010-09-30T18:35:03.167 回答
2

显而易见的替代方案是File.isFile(). 先试试那个。

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

如果以上两个都失败了,你可以使用File.length(). 如果它返回0L,您就知道该文件不存在。

于 2010-09-30T17:40:25.420 回答