Java資源獲取

Java資源獲取

在Java獲取資源的時候恳啥,通過絕對路徑獲取資源的方法在部署到生產(chǎn)環(huán)境時就不可用了右冻,所以需要通過動態(tài)獲取文件路徑的方法或者是相對路徑的方法來獲取資源代咸。在學(xué)習(xí)JavaWeb開發(fā)時驹碍,對于獲取文件有很多的不同背犯,在這總結(jié)一下

  1. Java程序中,通常通過getResource()方法獲取資源绍妨,其中有一下方法及其區(qū)別

    Class.getResource(String path);
    /*
    path不以"/"開頭時润脸,默認(rèn)是此包下獲取資源
    path在以"/"開頭時,默認(rèn)是此項目的ClassPath根下獲取資源
    */
    package com.test.testResource;
    public class Main {
        public static void main(String[] args) {
            System.out.println(Main.class.getResource("/"));
    
        }
    }
    
    /*
    輸出為file:/C:/Users/Chywan/OneDrive/daily_program/Java/LearningCode/Test/target/classes/
    */
    package com.test.testResource;
    public class Main {
        public static void main(String[] args) {
            System.out.println(Main.class.getResource(""));
    
        }
    }
    /*
    輸出為file:/C:/Users/Chywan/OneDrive/daily_program/Java/LearningCode/Test/target/classes/com/test/testResource/
    */
    
    //所以他去,其實在沒有加入"/“時獲取的是相對于類的相對路徑為”“所對應(yīng)的絕對路徑毙驯,在使用”/“后獲取的是編譯后的類的路徑,如maven編譯的項目就是target/classes/
    
    
    Class.getClassloader.getResource();
    /*
    ClassLoader的加載是雙親委派機制灾测,所以在獲取Main.class.getClassLoader()時獲得的是BootstrapClassLoader,是C++底層實現(xiàn)的爆价,所以getResource("/")獲取的是null,而getResource("")時,獲取的是加載器的相對路徑媳搪,我的理解是加載器是從項目的類根路徑起效的铭段,所以就算類根路徑
    */
    package com.test.testResource;
    public class Main {
        public static void main(String[] args) {
            System.out.println(Main.class.getClassLoader().getResource("/"));
    
        }
    }
    /*輸出為null
    */
    
    package com.test.testResource;
    public class Main {
        public static void main(String[] args) {
            System.out.println(Main.class.getClassLoader().getResource(""));
    
        }
    }
    /*輸出為file:/C:/Users/Chywan/OneDrive/daily_program/Java/LearningCode/Test/target/classes/
    */
    
    // 源碼里面可以看到resolveName()方法對路徑進行處理,本質(zhì)Class.getResource(String path)還是調(diào)用了ClassLoader的方法蛾号。
    public URL getResource(String name) {
        name = resolveName(name);
        //獲取資源
    }
    private String resolveName(String name) {
        if (!name.startsWith("/")) { //相對路徑
            Class<?> c = this;
            while (c.isArray()) {
                c = c.getComponentType();
            }
            String baseName = c.getPackageName(); //獲取包名
            if (baseName != null && !baseName.isEmpty()) { //拼接路徑
                name = baseName.replace('.', '/') + "/" + name;
            }
        } else { //根路徑開始
            name = name.substring(1);
        }
        return name;
    }
    
  2. JavaWeb中稠项,通常使用getContextPath()涯雅、getServletPath()鲜结、getRequestURI()request.getRealPath()等獲取資源活逆,區(qū)別如下

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(getServletContext().getRealPath("/"));
        System.out.println(getServletContext().getContextPath());
        System.out.println(req.getContextPath());
        System.out.println(req.getServletPath());
        System.out.println(req.getRealPath("/"));
        System.out.println(req.getRequestURI());
    }
    

    輸出為

    1. C:\Users\Chywan\env\apache-tomcat-9.0.37\webapps\Test_war\
    2. /Test_war
    3. /Test_war
    4. /test
    5. C:\Users\Chywan\env\apache-tomcat-9.0.37\webapps\Test_war\
    6. /Test_war/test

分析可知:

getRealPath()獲取的是文件在存儲的絕對路徑

getRequestURI()獲取的是項目名到請求的地址的路徑

getContextPath()獲取的是項目名精刷,也就是在Tomcat定位項目的名字,也叫做項目上下文context

getServletPath()獲取的是請求名蔗候,也可以說是Servlet的位置怒允,請求名是因為在web.xml中做了映射,如果是jsp獲取就是jsp的路徑

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锈遥,一起剝皮案震驚了整個濱河市纫事,隨后出現(xiàn)的幾起案子勘畔,更是在濱河造成了極大的恐慌,老刑警劉巖丽惶,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炫七,死亡現(xiàn)場離奇詭異,居然都是意外死亡钾唬,警方通過查閱死者的電腦和手機万哪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抡秆,“玉大人奕巍,你說我怎么就攤上這事∪迨浚” “怎么了的止?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長着撩。 經(jīng)常有香客問我冲杀,道長,這世上最難降的妖魔是什么睹酌? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任权谁,我火速辦了婚禮,結(jié)果婚禮上憋沿,老公的妹妹穿的比我還像新娘旺芽。我一直安慰自己,他們只是感情好辐啄,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布采章。 她就那樣靜靜地躺著,像睡著了一般壶辜。 火紅的嫁衣襯著肌膚如雪悯舟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天砸民,我揣著相機與錄音抵怎,去河邊找鬼。 笑死岭参,一個胖子當(dāng)著我的面吹牛反惕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播演侯,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼姿染,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了秒际?” 一聲冷哼從身側(cè)響起悬赏,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤狡汉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后闽颇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轴猎,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年进萄,在試婚紗的時候發(fā)現(xiàn)自己被綠了捻脖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡中鼠,死狀恐怖可婶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情援雇,我是刑警寧澤矛渴,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站惫搏,受9級特大地震影響具温,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜筐赔,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一铣猩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧茴丰,春花似錦达皿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至汰规,卻和暖如春汤功,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背溜哮。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工滔金, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人茬射。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓鹦蠕,卻偏偏與公主長得像冒签,于是被迫代替她去往敵國和親在抛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355