對于一般項目,這是項目的根路徑。對于JavaEE服務(wù)器,這可能是服務(wù)器的某個路徑。這個并沒有統(tǒng)一的規(guī)范!
所以,絕對不要使用“相對于當前用戶目錄的相對路徑”。然而:
默認情況下,java.io 包中的類總是根據(jù)當前用戶目錄來分析相對路徑名。此目錄由系統(tǒng)屬性 user.dir 指定,通常是 Java 虛擬機的調(diào)用目錄。
這就是說,在使用java.io包中的類時,最好不要使用相對路徑。否則,雖然在J2SE應(yīng)用程序中可能還算正常,但是到了J2EE程序中,一定會出問題!而且這個路徑,在不同的服務(wù)器中都是不同的!
相對路徑最佳實踐
推薦使用相對于當前classpath的相對路徑
因此,我們在使用相對路徑時,應(yīng)當使用相對于當前classpath的相對路徑。
ClassLoader類的getResource(String name),getResourceAsStream(String name)等方法,使用相對于當前項目的classpath的相對路徑來查找資源。
讀取屬性文件常用到的ResourceBundle類的getBundle(String path)也是如此。
通過查看ClassLoader類及其相關(guān)類的源代碼,我發(fā)現(xiàn),它實際上還是使用了URI形式的絕對路徑。通過得到當前classpath的URI形式的絕對路徑,構(gòu)建了相對路徑的URI形式的絕對路徑。(這個實際上是猜想,因為JDK內(nèi)部調(diào)用了SUN的源代碼,而這些代碼不屬于JDK,不是開源的。)