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