分別獲取圖中的a、b、c.properties:java
文件內容分別是:a=a;b=b;c=cweb
重點:注意獲取圖中文件的路徑寫法,不是直接看ide中的位置,而是要看項目發佈到tomcat以後該文件所在的位置。tomcat
優勢: 任意文件,任意路徑 缺點: 必須有web環境服務器
獲取文件真實(服務器)路徑:String getRealPath()
markdown
寫法:/b.properties
ide
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_HOME
和CATALINA_BASE
的區別: 簡單的說,CATALINA_HOME
是Tomcat的安裝目錄,CATALINA_BASE
是Tomcat的工做目錄。 若是想要運行Tomcat的多個實例,可是不想安裝多個Tomcat軟件副本。那麼能夠配置多個工做目錄,每一個運行實例獨佔一個工做目錄,可是共享同一個安裝目錄。 詳細介紹能夠參考我以前寫的Tomcat文章,裏面介紹了應用程序的部署方式:blog.csdn.net/CSDN_GIA/ar…this
/b.properties
從上一個例子能夠看出,/表明的服務器的路徑是:D:\WorkSpaces\IDEAWS\tomcatdemo\out\artifacts\tomcatdemo_war_exploded
url
/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); } 複製代碼
src下的全部資源未來會被放到WEB-INF目錄下的classes目錄下 寫法:/WEB-INF/classes/a.properties
spa
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); } 複製代碼
優勢:簡單方便 缺點:
- 只能拿取properties文件
- 只能拿取非web環境下的資源(即src目錄下的)
ResourceBundle類:該類(抽象類)專門用來加載資源,還能夠處理一些國際化的東西
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); } 複製代碼
優勢: 任意文件,任意路徑 缺點: 編寫稍顯麻煩
類加載器: 一個java文件,編寫好以後是源碼,後綴名是.java,要將這個源碼首先採用編譯命令javac把其編譯爲.class文件,該.class文件位於硬盤上,在運行時,須要把.class文件加載到虛擬機裏運行,就用類加載器來加載,類加載器的主要目的就是將字節碼文件加載到內存裏,而後運行字節碼文件
獲取類加載器的方式
經過類名 : 類名.class.getClassLoader()
經過對象: this.getClass().getClassLoader()
Class.forName(): Class.forName("類名").getClassLoader()
注意: this.getClass().getClassLoader().getResource("/");
是去類路徑去加載資源,即classes目錄下:
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); } 複製代碼
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); } 複製代碼
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); } } 複製代碼