2016-04-27 95 views
1

有没有人遇到过这种情况:java.io.File不存在,但文件实例调用getAbsoluteFile()方法返回一个确实存在的文件。为什么会发生?Java文件不存在但存在File.getAbsoluteFile()

enter image description here

  1. 我在Linux上加上甲骨文的Java运行时与版本1.7.0_95-b00
  2. 我通过在JVM选项-Duser.dir=/path/to/somewhere时 启动Tomcat实例
+0

这是否仅在调试器手表中发生?如果您在'try'块中调用这些方法并打印结果会怎么样? –

+0

它发生在程序和调试器手表 –

+0

这是仅在tomcat中发生,还是可以通过简单的独立应用程序([mcve])重现相同情况? –

回答

1

你可能不应该混淆user.dir。相反,在启动Tomcat之前切换到目录

File.getAbsoluteFile()假定user.dir是你真正在的目录,但你不是。

根据您的观察,我认为File.exists()在操作系统级别上直接映射到stat。而File.getAbsoluteFile()只是new File(System.getProperty("user.dir"), getPath())

假设user.dir是操作系统的当前工作目录,这两个实现是正确和合理的。但就你而言,它们有所不同,而这(假定的)实现可以解释你正在经历的事情。

+0

这是否意味着'java.io.File中有一些内部状态'可能不会与'System'的'user.dir'属性同步? –

+0

我更新了我的答案。 –

+0

够公平的。 File.exists最后依赖于'public native int getBooleanAttributes0(File f);'这是一个本地调用的返回结果。 –