top
Loading...
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 :
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗