1. 程式人生 > >專案中配置檔案路徑

專案中配置檔案路徑

1 場景

2 預備知識

3 解決辦法

4 windws和linux下路徑

1 場景

       在專案中大多會涉及到相對路徑和絕對路徑,以專案中的配置檔案為例,如何找到配置檔案的路徑?下面介紹幾種方法說明。

2 預備知識

(1)System.getProperty("user.dir") 得到的是java虛擬機器呼叫目錄即當前使用者目錄。

如果在eclipse使用該方法,因為Eclipse中啟動jvm都是在專案根路徑上啟動的,如專案所在路徑是E:\ProcessFileProcessFile,那麼上述方法得到的路徑是E:\ProcessFileProcessFile。

如果在tomcat中執行web應用,那麼輸出的將是tomcat下的bin目錄,如E:\tomcat-5.0.28\bin

如果你的可執行jar包的目錄是E:\,你啟動java包,那麼System.getProperty("user.dir")所指的目錄是E:\

(2)JAVA IO操作中相對路徑都是基於(1)中的這個路徑的。

3 方法

(1)方法一

以最終java工程打成jar包為例。因為執行java包System.getProperty("user.dir")得到的目錄是jar所在的目錄,所以配置檔案一般放在與jar包同級目錄。

在eclipse中java工程如下(配置資料夾config和原始碼src處於同一級目錄)

在程式碼中使用相對路徑找到配置檔案,可以看出相對路徑是相對於當前使用者目錄的


打成jar包以後,jar包需要和上述config資料夾放在同級目錄下,程式才能找到,如下圖


執行jar包得到配置檔案中的資訊


缺點:System.getProperty("user.dir")獲取的路徑在not-web aplication 和 web application中時不一樣的,不夠靈活。

(2)方法2

因為System.getProperty("user.dir")或相對路徑在tomcat中執行輸出的是tomcat下的bin目錄,如E:\tomcat-5.0.28\bin,而我們的wb工程一般是放在webapps下的,如E:\tomcat-5.0.28\webapps,那麼配置檔案具體位置可以根據System.getProperty("user.dir")的路徑找到。但是有一種更簡便的方法,不需要你釋出工程後另外拷貝配置檔案,只需在eclipse開發中放好,然後直接釋出到tomcat即可。

getResource("/").getPath()方法直接得到classes所在路徑的url(在not-web aplication 和 web application中都能得到程式的class所在根目錄),如\E:\tomcat-5.0.28\webapps\專案名稱\WEB-INF\classes\


String resourcePath=HandleFile.class.getResource("/").getPath(); 

注意:getResource方法使用了utf-8對路徑資訊進行了編碼,當路徑中存在中文和空格時,他會對這些字元進行轉換,這樣,得到的往往不是我們想要的真實路徑,在此,呼叫了URLDecoder的decode方法進行解碼,以便得到原始的中文及空格路徑。
classPath = java.net.URLDecoder.decode(classPath, "utf-8");

然後處理該路徑即得到classes所在路徑,因為我們在專案中src下面的東東是直接編譯到classes資料夾下面的,所以配置檔案放在src下就會自動編譯到classes資料夾下,故釋出到tomcat上時無需重新配置。例如下面


推薦使用方法2

4 windows和linux下路徑

直接看程式碼

	/**
	 *將路徑轉換成windows和linux下通用的路徑格式
	 *windows下路徑是E:\sample
	 *linux下路徑是/sample
	 * @param strPath 要轉換的路徑
	 * @return
	 */
	public static String commonPath(String strPath)
	{
		String resultPath=null;
		//windows 下
		if("\\".equals(File.separator))
		{
			resultPath=strPath.replace("/", "\\");
		}
		//linux 下
		if("/".equals(File.separator))
		{
			resultPath=strPath.replace("\\", "/");
		}
		return resultPath;
	}

5 完整程式碼

	/**
	 * 獲取專案類所在根路徑,如D:\java\apache-tomcat-7.0.28\webapps\RegistServiceSystem\WEB-INF\classes\
	 * @return
	 */
	public static String getClassesPath() {
		String classPath = ConfigReader.class.getResource("/").getPath().substring(1);
		try {
			// getResource方法使用了utf-8對路徑資訊進行了編碼,當路徑中存在中文和空格時,他會對這些字元進行轉換,這樣,得到的往往不是我們想要的真實路徑,
			// 在此,呼叫了URLDecoder的decode方法進行解碼,以便得到原始的中文及空格路徑。
			classPath = java.net.URLDecoder.decode(classPath, "utf-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}

		// windows 下
		if ("\\".equals(FS)) 
			classPath = classPath.replace("/", "\\");
		// linux 下
		if ("/".equals(FS)) 
			classPath = classPath.replace("\\", "/");
		
		return classPath;
	}