詳細(xì)介紹Java路徑的分類與使用注意事項
Java路徑簡單的分可以分為兩種:相對路徑和相對路徑。 下面引見有關(guān)Java路徑分類的一些細(xì)節(jié), 以及運(yùn)用Java路徑時需求注意的問題。
具體而言,Java路徑又分為四種:
一、URI方式的相對資源路徑如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/aaa. b URL是URI的特例。 URL的前綴/協(xié)議, 必須是Java看法的。 URL可以打開資源, 而URI則不行。 URL和URI對象可以相互轉(zhuǎn)換, 運(yùn)用各自的toURI(), toURL()辦法即可。
二、本地系統(tǒng)的相對路徑 D:/java/eclipse32/workspace/jbpmtest3/bin/aaa. b Java. io包中的類, 需求運(yùn)用這種方式的參數(shù)。 但是, 它們一般也提供了URI類型的參數(shù), 而URI類型的參數(shù), 接受的是URI款式的String。 因而, 通過URI轉(zhuǎn)換, 還是可以把URI款式的相對路徑用在java. io包中的類中。
三、相關(guān)于classpath的相對路徑如:相關(guān)于 file:/D:/java/eclipse32/workspace/jbpmtest3/bin/這個路徑的相對路徑。 其中, bin是本項目的classpath。 所有的Java源文件編譯后的. class文件復(fù)制到這個目錄中。
四、相關(guān)于當(dāng)前用戶目錄的相對路徑就是相關(guān)于System. getProperty("user. dir")返回的路徑。 關(guān)于一般項目, 這是項目的根路徑。 關(guān)于JavaEE效勞器, 這能夠是效勞器的某個路徑。 這個并沒有統(tǒng)一的規(guī)范。 所以, 相對不要運(yùn)用“相關(guān)于當(dāng)前用戶目錄的相對路徑”。
但是:默認(rèn)狀況下, java. io 包中的類總是根據(jù)當(dāng)前用戶目錄來分析相對路徑名。
此目錄由系統(tǒng)屬性 user. dir 指定, 通常是 Java 虛擬機(jī)的調(diào)用目錄。
這就是說, 在運(yùn)用java. io包中的類時, 最好不要運(yùn)用相對路徑。 否則, 雖然在J2SE應(yīng)用程序中能夠還算正常, 但是到了J2EE程序中, 一定會出問題。 而且這個路徑, 在不同的效勞器中都是不同的。 相對路徑最佳實(shí)際引薦運(yùn)用相關(guān)于當(dāng)前classpath的相對路徑因而, 我們在運(yùn)用相對路徑時, 該當(dāng)運(yùn)用相關(guān)于當(dāng)前classpath的相對路徑。
ClassLoader類的getResource(String name), getResourceAsStream(String name)等辦法, 運(yùn)用相關(guān)于當(dāng)前項目的classpath的相對路徑來查找資源。 讀取屬性文件常用到的ResourceBundle類的getBundle(String path)也是如此。 通過查看ClassLoader類及其相關(guān)類的源代碼, 我發(fā)現(xiàn), 它實(shí)踐上還是運(yùn)用了URI方式的相對路徑。 通過失掉當(dāng)前classpath的URI方式的相對路徑, 構(gòu)建了相對路徑的URI方式的相對路徑。 (這個實(shí)踐上是猜想, 由于JDK外部調(diào)用了SUN的源代碼, 而這些代碼不屬于JDK, 不是開源的。 ) 相對路徑本質(zhì)上還是相對路徑因而, 歸根結(jié)底, Java本質(zhì)上只能運(yùn)用相對路徑來尋找資源。
所有的相對路徑尋找資源的辦法, 都不過是一些便利辦法。 不過是API在底層協(xié)助我們構(gòu)建了相對路徑, 從而找到資源的。 失掉classpath和當(dāng)前類的相對路徑的一些辦法 下面是一些失掉classpath和當(dāng)前類的相對路徑的一些辦法。
Java路徑:你能夠需求運(yùn)用其中的一些辦法來失掉你需求的資源的相對路徑。
1, FileTest. class. getResource("") 失掉的是當(dāng)前類FileTest. class文件的URI目錄。 不包括本人。 如:
file:/D:/java/eclipse32/workspace/jbpmtest3/bin/com/test/
2, FileTest. class. getResource("/") 失掉的是當(dāng)前的classpath的相對URI路徑。 如:
file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
3, Thread. currentThread(). getContextClassLoader(). getResource("") 失掉的也是當(dāng)前ClassPath的相對URI路徑。 如:
file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
4, FileTest. class. getClassLoader(). getResource("") 失掉的也是當(dāng)前ClassPath的相對URI路徑。 如:
file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
5, ClassLoader. getSystemResource("") 失掉的也是當(dāng)前ClassPath的相對URI路徑。 如:
file:/D:/java/eclipse32/workspace/jbpmtest3/bin/ 我引薦運(yùn)用Thread. currentThread(). getContextClassLoader(). getResource("")來失掉當(dāng)前的classpath的相對路徑的URI表示法。 Web應(yīng)用程序中資源的尋址 上文中說過, 當(dāng)前用戶目錄, 即相關(guān)于System. getProperty("user. dir")返回的路徑。
關(guān)于JavaEE效勞器, 這能夠是效勞器的某個路徑, 這個并沒有統(tǒng)一的規(guī)范。
而不是我們發(fā)布的Web應(yīng)用程序的根目錄。
這樣, 在Web應(yīng)用程序中, 我們相對不能運(yùn)用相關(guān)于當(dāng)前用戶目錄的相對路徑。
在Web應(yīng)用程序中, 我們一般通過ServletContext. getRealPath("/")辦法失掉Web應(yīng)用程序的根目錄的相對路徑。 這樣, 我們只需求提供相關(guān)于Web應(yīng)用程序根目錄的路徑, 就可以構(gòu)建出定位資源的相對路徑。 這是我們開發(fā)Web應(yīng)用程序時一般所采取的戰(zhàn)略。
通用的相對路徑解決辦法 Java中各種相對路徑非常多, 不容易運(yùn)用, 非常容易出錯。 因而, 我編寫了一個便利辦法, 協(xié)助更容易的解決相對路徑問題。
Web應(yīng)用程序中運(yùn)用JavaSE運(yùn)轉(zhuǎn)的資源尋址問題在JavaSE程序中, 我們一般運(yùn)用classpath來作為存放資源的目的地。 但是, 在Web應(yīng)用程序中, 我們一般運(yùn)用classpath外面的WEB-INF及其子目錄作為資源文件的存放地。
在Web應(yīng)用程序中, 我們一般通過ServletContext. getRealPath("/")辦法失掉Web應(yīng)用程序的根目錄的相對路徑。 這樣, 我們只需求提供相關(guān)于Web應(yīng)用程序根目錄的路徑, 就可以構(gòu)建出定位資源的相對路徑。
Web應(yīng)用程序, 可以作為Web應(yīng)用程序停止發(fā)布和運(yùn)轉(zhuǎn)。
但是,我們也經(jīng)常會以JavaSE的方式來運(yùn)轉(zhuǎn)Web應(yīng)用程序的某個類的main辦法。
或者,運(yùn)用JUnit測試。 這都需求運(yùn)用JavaSE的方式來運(yùn)轉(zhuǎn)。
這樣,我們就無法運(yùn)用ServletContext. getRealPath("/")辦法失掉Web應(yīng)用程序的根目錄的相對路徑。
而JDK提供的ClassLoader類, 它的getResource(String name), getResourceAsStream(String name)等辦法, 運(yùn)用相關(guān)于當(dāng)前項目的classpath的相對路徑來查找資源。 讀取屬性文件常用到的ResourceBundle類的getBundle(String path)也是如此。 它們都只能運(yùn)用相對路徑來讀取classpath下的資源, 無法定位到classpath外面的資源。 Classpath外配置文件讀取問題如,我們運(yùn)用測試驅(qū)動開發(fā)的辦法, 開發(fā)Spring、Hibernate、iBatis等運(yùn)用配置文件的Web應(yīng)用程序, 就會遇到問題。
雖然Spring本人提供了FileSystem(也就是相關(guān)于user, dir目錄)來讀取Web配置文件的辦法, 但是終究不是很方便。 而且與Web程序中的代碼運(yùn)用方式不分歧。
至于Hibernate, iBatis就更麻煩了。只要把配置文件移到classpath下, 否則基本不能夠運(yùn)用測試驅(qū)動開發(fā)。