2016-04-27 99 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);'這是一個本地調用的返回結果。 –