Java路徑問題最終解決方案之一

推薦:經典教程專區
前言
Java的路徑問題,非常難搞。最近的工作涉及到創建和讀取文件的工作,這里我就給大家徹底得解決Java路徑問題。
我編寫了一個方法,比ClassLoader.getResource(String 相對路徑)方法的能力更強。它可以接受“http://www.zhujiangroad.com/”這樣的參數,允許我們用相對路徑來定位classpath外面的資源。這樣,我們就可以使用相對于classpath的路徑,定位所有位置的資源!
Java路徑
Java中使用的路徑,分為兩種:絕對路徑和相對路徑。具體而言,又分為四種:
一、URI形式的絕對資源路徑
如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b
URL是URI的特例。URL的前綴/協議,必須是Java認識的。URL可以打開資源,而URI則不行。
URL和URI對象可以互相轉換,使用各自的toURI(),toURL()方法即可!
二、本地系統的絕對路徑
D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b
Java.io包中的類,需要使用這種形式的參數。
但是,它們一般也提供了URI類型的參數,而URI類型的參數,接受的是URI樣式的String。因此,通過URI轉換,還是可以把URI樣式的絕對路徑用在java.io包中的類中。
三、相對于classpath的相對路徑
如:相對于
file:/D:/java/eclipse32/workspace/jbpmtest3/bin/這個路徑的相對路徑。其中,bin是本項目的classpath。所有的Java源文件編譯后的.class文件復制到這個目錄中。
四、相對于當前用戶目錄的相對路徑
就是相對于System.getProperty("user.dir")返回的路徑。
對于一般項目,這是項目的根路徑。對于JavaEE服務器,這可能是服務器的某個路徑。這個并沒有統一的規范!
所以,絕對不要使用“相對于當前用戶目錄的相對路徑”。然而:
默認情況下,java.io 包中的類總是根據當前用戶目錄來分析相對路徑名。此目錄由系統屬性 user.dir 指定,通常是 Java 虛擬機的調用目錄。
這就是說,在使用java.io包中的類時,最好不要使用相對路徑。否則,雖然在J2SE應用程序中可能還算正常,但是到了J2EE程序中,一定會出問題!而且這個路徑,在不同的服務器中都是不同的!
相對路徑最佳實踐
推薦使用相對于當前classpath的相對路徑
因此,我們在使用相對路徑時,應當使用相對于當前classpath的相對路徑。
ClassLoader類的getResource(String name),getResourceAsStream(String name)等方法,使用相對于當前項目的classpath的相對路徑來查找資源。
讀取屬性文件常用到的ResourceBundle類的getBundle(String path)也是如此。
通過查看ClassLoader類及其相關類的源代碼,我發現,它實際上還是使用了URI形式的絕對路徑。通過得到當前classpath的URI形式的絕對路徑,構建了相對路徑的URI形式的絕對路徑。(這個實際上是猜想,因為JDK內部調用了SUN的源代碼,而這些代碼不屬于JDK,不是開源的。)
共3頁。 1 2 3 :