Maven組織的web專案讀取WEB-INF下properties檔案
開發時經常要讀取properties檔案的配置資訊,但是properties檔案所在的位置和properties訪問方式不同讀取方式也不同,現就讀取properties檔案進行總結。
1、訪問方式一般分:java專案和web專案。
2、檔案位置:與原始檔相同目錄和與源目錄不相同
- java專案與原始檔相同目錄讀取properties檔案方法,在main函式中讀取
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
-
import
- import java.io.InputStream;
- import java.util.Properties;
- publicclass PropertiesUtils {
- publicstaticvoid main(String[] args) {
- Properties properties = new Properties();
- try {
-
InputStream in = PropertiesUtils.class.getResourceAsStream(
- properties.load(in);
- String url = properties.getProperty("url");
- String userName = properties.getProperty("user");
- String password = properties.getProperty("password");
-
System.out.println("url="
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
父級或子級目錄只要加相應的方法路徑即可。讀取properties檔案的關鍵是能夠訪問到properties檔案,讀取的方法是一樣的,主要在於訪問的方法不一樣。
這裡有兩個獲取當前執行緒類路徑根目錄的方法,分別為:
Thread.currentThread().getContextClassLoader().getResource("")和ClassLoader.getSystemResource("")
兩個方法作用一樣,通過以上方法獲取活動.classes檔案的目錄絕對位置,然後接受需要訪問的路徑即可。這兩個方法不使用在web功能webapp下的檔案方法,因為webapp下的檔案不會出現在classes路徑下。
- maven組織的web專案中讀取properties檔案方法
以下方法是在http請求情況下訪問的,部署伺服器為tomcat
獲取部署在tomcat下的真實地址進行拼接訪問,
- 絕對地址訪問方式:
- public Map<String, String> getDBInfo() {
- Map<String, String> dbInfo = new HashMap<String, String>();
- try {
- String url = this.getClass().getResource("").getPath();
- String path = url.substring(0, url.indexOf("WEB-INF")) + "WEB-INF/db.properties";
- Properties config = new Properties();
- InputStream in = new FileInputStream(path);
- config.load(in);
- String dbUrl = config.getProperty("url");
- dbInfo.put("url", dbUrl);
- dbInfo.put("userName", config.getProperty("user"));
- dbInfo.put("password", config.getProperty("password"));
- } catch (Exception e) {
- e.printStackTrace();
- }
- return dbInfo;
- }
- Servlet下的方法
- public Map<String, String> getDBInfo() {
- Map<String, String> dbInfo = new HashMap<String, String>();
- try {
- String path = getServletContext().getRealPath("");
- Properties config = new Properties();
- InputStream in = new FileInputStream(path+"/WEB-INF/db.properties");
- config.load(in);
- String dbUrl = config.getProperty("url");
- dbInfo.put("url", dbUrl);
- dbInfo.put("userName", config.getProperty("user"));
- dbInfo.put("password", config.getProperty("password"));
- } catch (Exception e) {
- e.printStackTrace();
- }
- return dbInfo;
- }
- Servlet下的方法,相對地址訪問方式:
- public Map<String, String> getDBInfo() {
- Map<String, String> dbInfo = new HashMap<String, String>();
- try {
- Properties config = new Properties();
- InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/db.properties");
- config.load(in);
- String dbUrl = config.getProperty("url");
- dbInfo.put("url", dbUrl);
- dbInfo.put("userName", config.getProperty("user"));
- dbInfo.put("password", config.getProperty("password"));
- } catch (Exception e) {
- e.printStackTrace();
- }
- return dbInfo;
- }
以上兩種區別主要在於getResourceAsStream和getResource。所有的方法主要的思路在於首先得到CLASS路徑值,即當前類.class檔案所有的路徑,然後在此路徑的基礎上通過父級、子級目錄或專案的根目錄開展遍歷,java工程和web工程所在的路徑是不一樣的。掌握獲取路徑的方法後,其他事就水到渠成了。
附錄:
Java中getResourceAsStream的用法:
首先,Java中的getResourceAsStream有以下幾種:
1. Class.getResourceAsStream(String path) : path 不以’/'開頭時預設是從此類所在的包下取資源,以’/'開頭則是從ClassPath根下獲取。其只是通過path構造一個絕對路徑,最終還是由ClassLoader獲取資源。
2. Class.getClassLoader.getResourceAsStream(String path) :預設則是從ClassPath根下獲取,path不能以’/'開頭,最終是由ClassLoader獲取資源。
3. ServletContext. getResourceAsStream(String path):預設從WebAPP根目錄下取資源,Tomcat下path是否以’/'開頭無所謂,當然這和具體的容器實現有關。
getResourceAsStream 用法大致有以下幾種:
第一: 要載入的檔案和.class檔案在同一目錄下,例如:com.demo 下有類Test.class ,同時有資原始檔myfile.xml
那麼,應該有如下程式碼:
Test.class.getResourceAsStream("myfile.xml");
第二:在me.class目錄的子目錄下,例如:com.demo 下有類Test.class ,同時在com.demo.file 目錄下有資原始檔myfile.xml
那麼,應該有如下程式碼:
Test.class.getResourceAsStream("file/myfile.xml");
或者如下寫法:
Test.class.getResourceAsStream("./file/myfile.xml");
第三:不在Test.class目錄下,也不在子目錄下,例如:com.demo 下有類Test.class ,同時在 com.demo.file 目錄下有資原始檔myfile.xml
那麼,應該有如下程式碼:
Test.class.getResourceAsStream("/com/demo/file/myfile.xml");
總結一下,可能只是兩種寫法
第一:前面有 “/”
“ / ”代表了工程的根目錄,例如工程名叫做myproject,“ / ”代表了myproject
Test.class.getResourceAsStream("/com/demo/file/myfile.xml");
第二:前面沒有 “/”,代表當前類的目錄(當前路徑也可以用“./”表示)
Test.class.getResourceAsStream("myfile.xml");
Test.class.getResourceAsStream("file/myfile.xml");
或者如下寫法:
Test.class.getResourceAsStream("./myfile.xml");
Test.class.getResourceAsStream("./file/myfile.xml");
http://blog.csdn.net/wpydaguan/article/details/45971649