摘要:中的路徑問題實例分析前言關于中得路徑問題,網(wǎng)上有很多獲取的答案,我這篇文章的目的在于說明獲取路徑時一些不常見的概念。在實際應用中使用的比較多的就是,當前路徑和配置文件的路徑其他文件的路徑。大氣層的高度是千米高等等。
Java中的路徑問題實例分析
前言:關于Java中得路徑問題,網(wǎng)上有很多獲取的答案,我這篇文章的目的在于說明獲取路徑時一些不常見的概念。在實際應用中使用的比較多的就是,當前路徑和配置文件的路徑(其他文件的路徑)。為了搞清楚路徑的問題我們不得不高清吃另一個問題, 那就是上下文Context, 我們可能聽過很多關于上下文的問題, 比如說sevletContext,applicationContext,httpContext,, springContext上下文很多,那么究竟什么是上下文呢?
java中的上下文Java中的上下文我們用到的地方非常多,比如說獲取路徑,資源定位,web項目啟動。但是我們只是知道有這么一個東西充滿了神秘感,而不知道它是什么。其實Context是一個抽象的概念,而不是確實存在的東西, 不像對象一樣是一個實質(zhì)的概念,我們可以這樣理解,他就是一個環(huán)境,舉個例子:在web項目中,我們將項目部署到了tomcat服務器中,而tomcat服務器同時也是一個容器,當我們想獲取容器里面的東西的時候,卻獲取不到,這時候Context就出現(xiàn)了, 它的上層就是容器本身,同時它包含了容器創(chuàng)建的和我們創(chuàng)建的所有東西,我們可以通過Context獲取我們想要的東西:例如資源位置。可以這樣想我們下了一個定義叫地球邊界,我們?nèi)藶榈囊?guī)定了它,它包含著整個地球里所有的東西,但是它卻并不是真實存在的,我們卻這樣去用它們來獲取一些東西,比如喜馬拉雅山海拔8848米。大氣層的高度是65000千米高等等。
這個上下文好似一雙無形的手,把所有的對象,組件囊括其中。
當前路徑 ClassLoader在獲取當前路徑前我們還必須要搞懂一樣東西就是類加載器,java的類加載機制(jvm規(guī)范)是委托模型,簡單的說,如果一個類加載器想要加載一個類,首先它會委托給它的parent去加載,如果它的所有parent都沒有成功的加載那么它才會自己親自來。所以當我們使用到類加載器的時候就獲取一定是該類的執(zhí)行路徑,也就是編譯后路徑,也就是 .class文件的路徑。
通過getResource()來獲取路徑。
public java.net.URL getResource(String name) {
name = resolveName(name); ClassLoader cl = getClassLoader0(); if (cl==null) { // A system class. return ClassLoader.getSystemResource(name); } return cl.getResource(name);
}
在這里源碼中寫道 return ClassLoader.getSystemResource(name);它自動調(diào)用了類加載器的方法。所以也會是一個編譯后路徑,而我們在web項目中也是將項目編譯后放入tomcat中得,所以當項目運行時找這個路徑也是符合情理的。例如:
String currentPath1 = PathTest.class.getResource("").getPath(); System.out.println("當前類路徑為1:" + currentPath1); String currentPath2 = PathTest.class.getClassLoader().getResource("").getPath(); System.out.println("當前類路徑為2:" + currentPath2); String currentPath3 = Thread.currentThread().getContextClassLoader().getResource("").getPath(); System.out.println("當前類路徑為3:" + currentPath3);
它們的結(jié)果是:
當前類路徑為1:/E:/IdeaWorkspace/path-analysis/out/production/path-analysis/testOthers/ 當前類路徑為2:/E:/IdeaWorkspace/path-analysis/out/production/path-analysis/ 當前類路徑為3:/E:/IdeaWorkspace/path-analysis/out/production/path-analysis/
另外sevlet中可以通過ServletContext來獲取路徑:
String path = ServletContext.class.getClassLoader().getResource("").getPath(); String path2 = ServletContext.class.getResource("/").getPath(); System.out.println(path); System.out.println(path2); 這是結(jié)果:注意上面的getClassLoader(),一個有一個沒有; /E:/IdeaWorkspace/path-analysis/out/production/path-analysis/ /E:/IdeaWorkspace/path-analysis/out/production/path-analysis/
注意:上面的結(jié)果還有些不同直接通過getResource()得到的才是包含包名的類路徑。
獲取項目根路徑的方法為:就這直接在getResource("/")這個方法中加上了根路徑符。
配置文件的路徑可以通過這種方式來獲取配置文件的路徑,加上配置文件的相對路徑名就好了:
String currentPath3 = Thread.currentThread().getContextClassLoader().getResource("resource/file.txt").getPath(); System.out.println("當前類路徑為3:" + currentPath3);
結(jié)果為:
當前類路徑為3:/E:/IdeaWorkspace/path-analysis/out/production/path-analysis/resource/file.txt
獲取配置文件的路徑名在spring和其他框架中又有其他方式,這里不做過多說明了,網(wǎng)上教程一大堆。
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/70958.html
摘要:返回一個路徑,該路徑是冗余名稱元素的消除。本節(jié)教程將覆蓋大部分方法。在本例中,這個數(shù)組內(nèi)包含了,表示檢測時不包含符號鏈接文件。遍歷整個文件目錄接受一個和作為參數(shù)。 Java面試通關手冊(Java學習指南)github地址(歡迎star和pull):https://github.com/Snailclimb/Java_Guide 歷史回顧: Java NIO 概覽 Java NIO 之 ...
任何程序都需要加載到內(nèi)存才能與CPU進行交流 同理, 字節(jié)碼.class文件同樣需要加載到內(nèi)存中,才可以實例化類 ClassLoader的使命就是提前加載.class 類文件到內(nèi)存中 在加載類時,使用的是Parents Delegation Model(溯源委派加載模型) Java的類加載器是一個運行時核心基礎設施模塊,主要是在啟動之初進行類的加載、鏈接、初始化 showImg(https://s...
摘要:在我認識范圍內(nèi)完成的是在日文文本分析方面的最強王者。簡介是一個開源的日文詞法分析的庫。功能你可以用它來對日文文本進行如下的處理,包括且不僅包括分詞給出讀音包括漢字詞性詞干提取你也可以在的嘗試。關聯(lián)可以將日文漢字轉(zhuǎn)換成平假名,片假名或的 在我認識范圍內(nèi)atilika完成的Kuromoji是在日文文本分析方面的最強王者。 簡介 kuromoji是一個開源的日文詞法分析的JAVA庫。 但也...
閱讀 2781·2023-04-25 14:41
閱讀 2375·2021-11-23 09:51
閱讀 3674·2021-11-17 17:08
閱讀 1667·2021-10-18 13:31
閱讀 5528·2021-09-22 15:27
閱讀 910·2019-08-30 15:54
閱讀 2222·2019-08-30 13:16
閱讀 728·2019-08-29 17:04