Java中獲取資源文件三種方式

獲取資源文件有三種方式

  • 採用 ServletContext對象獲取
  • 採用ResourceBundle類來獲取
  • 採用類加載器獲取

分別獲取圖中的a、b、c.properties:java

image.png

文件內容分別是:a=a;b=b;c=cweb

重點:注意獲取圖中文件的路徑寫法,不是直接看ide中的位置,而是要看項目發佈到tomcat以後該文件所在的位置。tomcat

1、採用 ServletContext對象獲取

優勢: 任意文件,任意路徑 缺點: 必須有web環境服務器

獲取文件真實(服務器)路徑:String getRealPath()markdown

1.1 獲取web目錄下資源b.properties

寫法:/b.propertieside

package com.hcx.web.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;

/** * Created by hongcaixia on 2019/11/19. */
@WebServlet("/getResourceFileServlet")
public class GetResourceFileServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        getWebResource();
    }
    /** * 獲取web下的資源b.properties,查看文件發佈到tomcat的位置爲/b.properties */
    public void getWebResource(){
        ServletContext servletContext = this.getServletContext();
        String realPath = servletContext.getRealPath("/b.properties");
        //文件的路徑是:D:\WorkSpaces\IDEAWS\tomcatdemo\out\artifacts\tomcatdemo_war_exploded\b.properties
        System.out.println("文件的路徑是:"+realPath);
        Properties properties = new Properties();
        try {
            properties.load(new FileReader(realPath));
        } catch (IOException e) {
            e.printStackTrace();
        }
        Object b = properties.get("b");
        //獲取到的key是:b
        System.out.println("獲取到的key值是:"+b);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

複製代碼

項目啓動後從日誌中找到CATALINA_BASE值:C:\Users\HCX\.IntelliJIdea2017.2\system\tomcat\Tomcat_8_5_0_tomcatdemo oop

CATALINA_BASE.png

CATALINA_HOMECATALINA_BASE的區別: 簡單的說,CATALINA_HOME是Tomcat的安裝目錄,CATALINA_BASE是Tomcat的工做目錄。 若是想要運行Tomcat的多個實例,可是不想安裝多個Tomcat軟件副本。那麼能夠配置多個工做目錄,每一個運行實例獨佔一個工做目錄,可是共享同一個安裝目錄。 詳細介紹能夠參考我以前寫的Tomcat文章,裏面介紹了應用程序的部署方式:blog.csdn.net/CSDN_GIA/ar…this

發佈到服務器的路徑.png

image.png
因此,b.properties文件位於服務器的根目錄下,寫法爲 /b.properties

1.2 獲取WEB-INF目錄下資源c.properties

image.png

從上一個例子能夠看出,/表明的服務器的路徑是:D:\WorkSpaces\IDEAWS\tomcatdemo\out\artifacts\tomcatdemo_war_exploded url

image.png
因此 WEB-INF下資源寫法爲: /WEB-INF/c.properties

/** * 獲取WEB-INF下資源c.properties */
    public void getWebINFOResource() {
        ServletContext servletContext = this.getServletContext();
        String realPath = servletContext.getRealPath("/WEB-INF/c.properties");
        //文件的路徑是:D:\WorkSpaces\IDEAWS\tomcatdemo\out\artifacts\tomcatdemo_war_exploded\WEB-INF\c.properties
        System.out.println("文件的路徑是:" + realPath);
        Properties properties = new Properties();
        try {
            properties.load(new FileReader(realPath));
        } catch (IOException e) {
            e.printStackTrace();
        }
        Object c = properties.get("c");
        //獲取到的key值是:c
        System.out.println("獲取到的key值是:" + c);
    }
複製代碼

1.3 獲取src目錄下資源a.properties

image.png

src下的全部資源未來會被放到WEB-INF目錄下的classes目錄下 寫法:/WEB-INF/classes/a.propertiesspa

public void getSrcResource() {
        ServletContext servletContext = this.getServletContext();
        String realPath = servletContext.getRealPath("/WEB-INF/classes/a.properties");
        //文件的路徑是:D:\WorkSpaces\IDEAWS\tomcatdemo\out\artifacts\tomcatdemo_war_exploded\WEB-INF\classes\a.properties
        System.out.println("文件的路徑是:" + realPath);
        Properties properties = new Properties();
        try {
            properties.load(new FileReader(realPath));
        } catch (IOException e) {
            e.printStackTrace();
        }
        Object a = properties.get("a");
        //獲取到的key值是:a
        System.out.println("獲取到的key值是:" + a);
    }
複製代碼

2、採用ResourceBundle類來獲取

優勢:簡單方便 缺點:

  • 只能拿取properties文件
  • 只能拿取非web環境下的資源(即src目錄下的)

ResourceBundle類:該類(抽象類)專門用來加載資源,還能夠處理一些國際化的東西

2.1 獲取src目錄下資源a.properties

image.png

public void getSrcResource() {
        //獲取ResourceBundle對象(專門用來獲取properties文件的信息,因此不用加後綴名.properties)
        ResourceBundle resourceBundle = ResourceBundle.getBundle("a");
        String a = resourceBundle.getString("a");
        System.out.println("src下資源文件:" + a);

        //獲取ResourceBundle對象(專門用來獲取properties文件的信息,因此不用加後綴名.properties)
        ResourceBundle resourceBundle2 = ResourceBundle.getBundle("com.hcx.web.d");
        String d = resourceBundle2.getString("d");
        System.out.println("src下資源文件:" + d);
    }
複製代碼

3、採用類加載器獲取

優勢: 任意文件,任意路徑 缺點: 編寫稍顯麻煩

類加載器: 一個java文件,編寫好以後是源碼,後綴名是.java,要將這個源碼首先採用編譯命令javac把其編譯爲.class文件,該.class文件位於硬盤上,在運行時,須要把.class文件加載到虛擬機裏運行,就用類加載器來加載,類加載器的主要目的就是將字節碼文件加載到內存裏,而後運行字節碼文件

獲取類加載器的方式

  1. 經過類名 : 類名.class.getClassLoader()

  2. 經過對象: this.getClass().getClassLoader()

  3. Class.forName(): Class.forName("類名").getClassLoader()

注意: this.getClass().getClassLoader().getResource("/");是去類路徑去加載資源,即classes目錄下:

classes目錄.png

3.1 獲取web目錄下資源b.properties

public void getWebResourceByClassLoader(){
        //url:file:/D:/WorkSpaces/IDEAWS/tomcatdemo/out/artifacts/tomcatdemo_war_exploded/WEB-INF/classes/
        URL url = this.getClass().getClassLoader().getResource("/");
        InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("../../b.properties");

        Properties properties = new Properties();
        try {
            properties.load(resourceAsStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
        String b = properties.getProperty("b");
        System.out.println(b);

    }
複製代碼

3.2 獲取WEB-INF目錄下資源c.properties

public void getWebInfoResourceByClassLoader(){
        //url:file:/D:/WorkSpaces/IDEAWS/tomcatdemo/out/artifacts/tomcatdemo_war_exploded/WEB-INF/classes/
        URL url = this.getClass().getClassLoader().getResource("/");
        InputStream resourceAsStream1 = this.getClass().getClassLoader().getResourceAsStream("../../WEB-INF/c.properties");

        Properties properties = new Properties();
        try {
            properties.load(resourceAsStream1);
        } catch (IOException e) {
            e.printStackTrace();
        }
        String c = properties.getProperty("c");
        System.out.println(c);
    }
複製代碼

3.3 獲取src目錄下資源a.properties

package com.hcx.web.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.ResourceBundle;

/** * Created by hongcaixia on 2019/11/19. */
@WebServlet("/getResourceFileServlet")
public class GetResourceFileServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        getSrcResourceByClassLoader();
    }

    public void getSrcResourceByClassLoader(){
        //獲取類加載器方式:
        /** * 1.經過類名:ClassLoader classLoader = GetResourceFileServlet.class.getClassLoader(); * 2.經過對象:ClassLoader classLoader = this.getClass().getClassLoader(); * 3.經過Class.forName():ClassLoader classLoader = Class.forName("GetResourceFileServlet").getClassLoader(); */
        InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("a.properties");
        Properties properties = new Properties();
        try {
            properties.load(resourceAsStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
        String a = properties.getProperty("a");
        System.out.println(a);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

複製代碼
相關文章
相關標籤/搜索