有沒有人遇到過這種情況:java.io.File
不存在,但文件實例調用getAbsoluteFile()
方法返回一個確實存在的文件。爲什麼會發生?Java文件不存在但存在File.getAbsoluteFile()
注
- 我在Linux上加上甲骨文的Java運行時與版本
1.7.0_95-b00
- 我通過在JVM選項
-Duser.dir=/path/to/somewhere
時 啓動Tomcat實例
有沒有人遇到過這種情況:java.io.File
不存在,但文件實例調用getAbsoluteFile()
方法返回一個確實存在的文件。爲什麼會發生?Java文件不存在但存在File.getAbsoluteFile()
注
1.7.0_95-b00
-Duser.dir=/path/to/somewhere
時 啓動Tomcat實例你可能不應該混淆user.dir
。相反,在啓動Tomcat之前切換到目錄。
File.getAbsoluteFile()
假定user.dir
是你真正在的目錄,但你不是。
根據您的觀察,我認爲File.exists()
在操作系統級別上直接映射到stat
。而File.getAbsoluteFile()
只是new File(System.getProperty("user.dir"), getPath())
。
假設user.dir
是操作系統的當前工作目錄,這兩個實現是正確和合理的。但就你而言,它們有所不同,而這(假定的)實現可以解釋你正在經歷的事情。
這是否意味着'java.io.File中有一些內部狀態'可能不會與'System'的'user.dir'屬性同步? –
我更新了我的答案。 –
夠公平的。 File.exists最後依賴於'public native int getBooleanAttributes0(File f);'這是一個本地調用的返回結果。 –
這是否僅在調試器手錶中發生?如果您在'try'塊中調用這些方法並打印結果會怎麼樣? –
它發生在程序和調試器手錶 –
這是僅在tomcat中發生,還是可以通過簡單的獨立應用程序([mcve])重現相同情況? –