詳細介紹Java路徑的分類與使用注意事項
Java路徑簡單的分可以分為兩種:相對路徑和相對路徑。 下面引見有關Java路徑分類的一些細節, 以及運用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, 不是開源的。 ) 相對路徑本質上還是相對路徑因而, 歸根結底, Java本質上只能運用相對路徑來尋找資源。
所有的相對路徑尋找資源的辦法, 都不過是一些便利辦法。 不過是API在底層協助我們構建了相對路徑, 從而找到資源的。 失掉classpath和當前類的相對路徑的一些辦法 下面是一些失掉classpath和當前類的相對路徑的一些辦法。
Java路徑:你能夠需求運用其中的一些辦法來失掉你需求的資源的相對路徑。
1, FileTest. class. getResource("") 失掉的是當前類FileTest. class文件的URI目錄。 不包括本人。 如:
file:/D:/java/eclipse32/workspace/jbpmtest3/bin/com/test/
2, FileTest. class. getResource("/") 失掉的是當前的classpath的相對URI路徑。 如:
file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
3, Thread. currentThread(). getContextClassLoader(). getResource("") 失掉的也是當前ClassPath的相對URI路徑。 如:
file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
4, FileTest. class. getClassLoader(). getResource("") 失掉的也是當前ClassPath的相對URI路徑。 如:
file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
5, ClassLoader. getSystemResource("") 失掉的也是當前ClassPath的相對URI路徑。 如:
file:/D:/java/eclipse32/workspace/jbpmtest3/bin/ 我引薦運用Thread. currentThread(). getContextClassLoader(). getResource("")來失掉當前的classpath的相對路徑的URI表示法。 Web應用程序中資源的尋址 上文中說過, 當前用戶目錄, 即相關于System. getProperty("user. dir")返回的路徑。
關于JavaEE效勞器, 這能夠是效勞器的某個路徑, 這個并沒有統一的規范。
而不是我們發布的Web應用程序的根目錄。
這樣, 在Web應用程序中, 我們相對不能運用相關于當前用戶目錄的相對路徑。
在Web應用程序中, 我們一般通過ServletContext. getRealPath("/")辦法失掉Web應用程序的根目錄的相對路徑。 這樣, 我們只需求提供相關于Web應用程序根目錄的路徑, 就可以構建出定位資源的相對路徑。 這是我們開發Web應用程序時一般所采取的戰略。
通用的相對路徑解決辦法 Java中各種相對路徑非常多, 不容易運用, 非常容易出錯。 因而, 我編寫了一個便利辦法, 協助更容易的解決相對路徑問題。
Web應用程序中運用JavaSE運轉的資源尋址問題在JavaSE程序中, 我們一般運用classpath來作為存放資源的目的地。 但是, 在Web應用程序中, 我們一般運用classpath外面的WEB-INF及其子目錄作為資源文件的存放地。
在Web應用程序中, 我們一般通過ServletContext. getRealPath("/")辦法失掉Web應用程序的根目錄的相對路徑。 這樣, 我們只需求提供相關于Web應用程序根目錄的路徑, 就可以構建出定位資源的相對路徑。
Web應用程序, 可以作為Web應用程序停止發布和運轉。
但是,我們也經常會以JavaSE的方式來運轉Web應用程序的某個類的main辦法。
或者,運用JUnit測試。 這都需求運用JavaSE的方式來運轉。
這樣,我們就無法運用ServletContext. getRealPath("/")辦法失掉Web應用程序的根目錄的相對路徑。
而JDK提供的ClassLoader類, 它的getResource(String name), getResourceAsStream(String name)等辦法, 運用相關于當前項目的classpath的相對路徑來查找資源。 讀取屬性文件常用到的ResourceBundle類的getBundle(String path)也是如此。 它們都只能運用相對路徑來讀取classpath下的資源, 無法定位到classpath外面的資源。 Classpath外配置文件讀取問題如,我們運用測試驅動開發的辦法, 開發Spring、Hibernate、iBatis等運用配置文件的Web應用程序, 就會遇到問題。
雖然Spring本人提供了FileSystem(也就是相關于user, dir目錄)來讀取Web配置文件的辦法, 但是終究不是很方便。 而且與Web程序中的代碼運用方式不分歧。
至于Hibernate, iBatis就更麻煩了。只要把配置文件移到classpath下, 否則基本不能夠運用測試驅動開發。

















