Java讀取資源文件的那些事

      本文主要講解和總結java讀取properties/xml等資源文件的幾種方法,以備來日使用時翻閱。無論是Servlet、Struts或者Spring、Hibernate,配置資源文件都是必不可少的一項工作,Java中主要提供了提供了2個類來讀取資源文件,一個是Class類,一個是ClassLoader類。我們一步步來分析,要獲取一個文件的內容,那第一步肯定是要先獲取文件的路徑,第二步纔是讀取文件內容。


     本文地址:http://blog.csdn.net/chen_zw/article/details/18771897


      步驟一:獲取資源文件路徑

       java的Web項目結構相信大家應該都很熟悉,它大概是這樣的:

       

       如上圖所示,它主要分爲了3部分,一個是source folder(src目錄下),一個是output folder(build目錄下),最後一個是deploy path(WebRoot) ,可能大家的命名不一樣,但這3部分對應的功能是一致的。想修改這3部分對應的文件目錄,可以選中項目,右鍵選properties,然後選中Java Build Path進行修改,如下圖所示:

       

        首先說下source folder目錄,這個目錄下存放的是項目java源碼,也就是可閱讀、可編寫的代碼。而output folder目錄則存放着java源碼編譯後生成的字節碼,是.class文格式的,最後是deploy path目錄,這是javaWeb項目獨有的,主要存放的是Web相關的jar包、配置文件和網頁資源等。我們可能將要讀取的資源文件放在在source folder(src )或者deploy path(WebRoot )目錄下,而兩者的讀取方式也是不同的。

        我們先來看看放在source folder(src )目錄下的資源文件如何讀取的吧,假設資源文件放置在這裏:

          

public class PropertiesUtil {
	
	/**
	 * @Description: 我們使用Class.getResourceAsStream(String path)方法來獲取資源文件
	 * @author: chenzw 
	 * @CreateTime: 2014-1-25 下午7:02:40
	 * @param args 
	 * @throws 
	 */
	public static void main(String[] args) {
		/* path中不以'/'開頭表示該路徑是相對路徑,相對於當前類所在的目錄  */
		InputStream is = PropertiesUtil.class.getResourceAsStream("cfg/jdbc.properties");
		// 等同於 InputStream is = this.getClass().getResourceAsStream("cfg/jdbc.properties"); --this.getClass()不能在static方法中使用
		
		/* path中以'/'開頭表示該路徑是絕對路徑,相對於classpath的絕對路徑 */
		InputStream is2 = PropertiesUtil.class.getResourceAsStream("/com/util/cfg/jdbc.properties");
		// 等同於 InputStream is2 = this.getClass().getResourceAsStream("/com/util/cfg/jdbc.properties"); --this.getClass()不能在static方法中使用
		// 等同於 InputStream is2 = Thread.currentThread().getClass().getResourceAsStream("/com/util/cfg/jdbc.properties");
		
		/* 使用getClassLoader()表示該路徑是相對於classpath目錄的相對路徑*/
		InputStream is3 = PropertiesUtil.class.getClassLoader().getResourceAsStream("com/util/cfg/jdbc.properties");
		// 等同於 InputStream is3 = this.getClass().getClassLoader().getResourceAsStream("com/util/cfg/jdbc.properties"); --this.getClass()不能在static方法中使用
                // 等同於 InputStream is3 = Thread.currentThread().getContextClassLoader().getResourceAsStream("com/util/cfg/jdbc.properties");

		//這3種方式獲取的資源文件是同一個。
	}

}

          再來看看放在WebRoot目錄下的資源文件是怎麼讀取的,假設資源文件存放在這裏:

          


     步驟二:讀取資源文件

package com.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class PropertiesUtil {
	
	/**
	 * @throws IOException 
	 * @Description: 我們使用Class.getResourceAsStream(String path)方法來獲取資源文件
	 * @author: chenzw 
	 * @CreateTime: 2014-1-25 下午7:02:40
	 * @param args 
	 * @throws 
	 */
	public static void main(String[] args) throws IOException {
		//資源文件路徑的多種獲取方法詳見步驟一
		InputStream is = PropertiesUtil.class.getResourceAsStream("cfg/jdbc.properties");
		
		Properties ps = new Properties();
		//加載properties資源文件
		ps.load(is);
		System.out.println(ps.getProperty("jdbc.url"));
		System.out.println(ps.getProperty("jdbc.user"));
		System.out.println(ps.getProperty("jdbc.pass"));
	}

}

發佈了109 篇原創文章 · 獲贊 101 · 訪問量 216萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章