Java 讀取配置文件的五種方式

方式一:采用ServletContext讀取,讀取配置文件的realpath府适,然后通過文件流讀取出來羔飞。

因為是用ServletContext讀取文件路徑,所以配置文件可以放入在WEB-INFclasses目錄中檐春,也可以在應(yīng)用層級WEB-INF的目錄中逻淌。
文件存放位置具體在eclipse工程中的表現(xiàn)是:可以放在src下面,也可放在web-info及webroot下面等疟暖。
因為是讀取出路徑后卡儒,用文件流進行讀取的,所以可以讀取任意的配置文件包括xml和properties俐巴。缺點:不能在servlet外面應(yīng)用讀取配置信息骨望。

具體舉例如下:

    //ServletContext.getRealPath(name)讀取路徑
    private void test1(HttpServletRequest request, HttpServletResponseresponse)  
    throws ServletException,IOException {
       //response.setContentType("text/html;charset=utf-8");
       String path = "/WEB-INF/jdbc_connection.properties"; //讀取WEB-INF中的配置文件
       String realPath = getServletContext().getRealPath(path);
       //getServletContext()相當(dāng)于http://localhost/demo05
       //所以后面的path只需要以應(yīng)用demo05/開頭具體的部署目錄路徑即可,如上面的/web-in…
       System.out.println(realPath);

       InputStreamReader reader =new InputStreamReader(newFileInputStream(realPath),"utf-8");
       Properties props = new Properties();
       props.load(reader); //load個人建議還是用Reader來讀欣舵,因為reader體系中有個InputStreamReader可以指定編碼
       String jdbcConValue = props.getProperty("jdbc_con");
       System.out.println(jdbcConValue);

       System.out.println("加載src包下的資源------------------------");
       path = "/WEB-INF/classes/com/test/servlet/jdbc_connection.properties";
       realPath=getServletContext().getRealPath(path);
       System.out.println(realPath);

       reader = new InputStreamReader(new FileInputStream(realPath),"utf-8");
       props.load(reader); //load個人建議還是用Reader來讀擎鸠,因為reader體系中有個InputStreamReader可以指定編碼
       jdbcConValue = props.getProperty("jdbc_con");
       System.out.println("second::"+jdbcConValue);
      
    }

?
?
?

方式二:采用ResourceBundle類讀取配置信息,

優(yōu)點是:可以以完全限定類名的方式加載資源后缘圈,直接的讀取出來劣光,且可以在非Web應(yīng)用中讀取資源文件袜蚕。
缺點:只能加載類classes下面的資源文件,且只能讀取.properties文件绢涡。

    /**
     * 獲取指定.properties配置文件中所以的數(shù)據(jù)
     * @param propertyName
     *        調(diào)用方式:
     *            1.配置文件放在resource源包下廷没,不用加后綴
     *              PropertiesUtil.getAllMessage("message");
     *            2.放在包里面的
     *              PropertiesUtil.getAllMessage("com.test.message");
     * @return
     */
    public static List<String> getAllMessage(String propertyName) {
        // 獲得資源包
        ResourceBundle rb = ResourceBundle.getBundle(propertyName.trim());
        // 通過資源包拿到所有的key
        Enumeration<String> allKey = rb.getKeys();
        // 遍歷key 得到 value
        List<String> valList = new ArrayList<String>();
        while (allKey.hasMoreElements()) {
            String key = allKey.nextElement();
            String value = (String) rb.getString(key);
            valList.add(value);
        }
        return valList;
    }

?
?
?

方式三:采用ClassLoader方式進行讀取配置信息

優(yōu)點是:可以在非Web應(yīng)用中讀取配置資源信息,可以讀取任意的資源文件信息垂寥。
缺點:只能加載類classes下面的資源文件。

    /**獲取的是classes路徑下的文件
     * 優(yōu)點是:可以在非Web應(yīng)用中讀取配置資源信息另锋,可以讀取任意的資源文件信息
     * 缺點:只能加載類classes下面的資源文件滞项。
     * 如果要加上路徑的話:com/test/servlet/jdbc_connection.properties
     */
    private static void use_classLoador(){
        //獲取文件流
        InputStream is=TestJava.class.getClassLoader().getResourceAsStream("message.properties");

        //獲取文件的位置
        String filePath=TestJava.class.getClassLoader().getResource("message.properties").getFile();
        System.out.println(filePath);

    }

修改Properties:

    /**
     * 傳遞鍵值對的Map,更新properties文件
     * @param fileName
     *        文件名(放在resource源包目錄下)夭坪,需要后綴
     * @param keyValueMap
     *        鍵值對Map
     */
    public static void updateProperties(String fileName, Map<String,String> keyValueMap) {
        //InputStream inputStream =  
        //   PropertiesUtil.class.getClassLoader().getResourceAsStream(fileName); //輸入流
        String filePath = 
           PropertiesUtil.class.getClassLoader().getResource(fileName).getFile(); //文件的路徑
        System.out.println("propertiesPath:" + filePath);
        Properties props = new Properties();
        BufferedReader br = null;
        BufferedWriter bw = null;

        try {
            // 從輸入流中讀取屬性列表(鍵和元素對)
            br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath)));
            props.load(br);
            br.close();

            // 寫入屬性文件
            bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath)));
            props.clear();// 清空舊的文件
            for (String key : keyValueMap.keySet())
                props.setProperty(key, keyValueMap.get(key));
            props.store(bw, "");
            bw.close();
        } catch (IOException e) {
            System.err.println("Visit " + filePath + " for updating value error");
        } finally {
            try {
                br.close();
                bw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

?
?
?

方法四:getResouceAsStream

XmlParserHandler.class.getResourceAsStream 與 classloader 的不同之處在于使用的是當(dāng)前類的相對路徑文判。

BufferedReader br=new BufferedReader( 
  new InputStreamReader(
    XmlParserHandler.class.getResourceAsStream("./rain.xml"),  //./代表當(dāng)前目錄不寫也可以    
    "GB2312"
  )
);

?
?
?

方法五:PropertiesLoaderUtils 工具類

Spring 提供的 PropertiesLoaderUtils 允許您直接通過基于類路徑的文件地址加載屬性資源。
最大的好處就是:實時加載配置文件室梅,修改后立即生效戏仓,不必重啟。

    private static void springUtil(){
        Properties props = new Properties();
        while(true){
            try {
                props=PropertiesLoaderUtils.loadAllProperties("message.properties");
                for(Object key:props.keySet()){
                    System.out.print(key+":");
                    System.out.println(props.get(key));
                }
            } catch (IOException e) {
                System.out.println(e.getMessage());
            }
            
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亡鼠,一起剝皮案震驚了整個濱河市赏殃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌间涵,老刑警劉巖仁热,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異勾哩,居然都是意外死亡抗蠢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門思劳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來迅矛,“玉大人,你說我怎么就攤上這事潜叛』喟” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵威兜,是天一觀的道長震嫉。 經(jīng)常有香客問我,道長牡属,這世上最難降的妖魔是什么票堵? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮逮栅,結(jié)果婚禮上悴势,老公的妹妹穿的比我還像新娘窗宇。我一直安慰自己,他們只是感情好特纤,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布军俊。 她就那樣靜靜地躺著,像睡著了一般捧存。 火紅的嫁衣襯著肌膚如雪粪躬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天昔穴,我揣著相機與錄音镰官,去河邊找鬼。 笑死吗货,一個胖子當(dāng)著我的面吹牛泳唠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宙搬,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼笨腥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了勇垛?” 一聲冷哼從身側(cè)響起脖母,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎闲孤,沒想到半個月后镶奉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡崭放,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年哨苛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片币砂。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡建峭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出决摧,到底是詐尸還是另有隱情亿蒸,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布掌桩,位于F島的核電站边锁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏波岛。R本人自食惡果不足惜茅坛,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望则拷。 院中可真熱鬧贡蓖,春花似錦曹鸠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至晾蜘,卻和暖如春邻眷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背剔交。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工肆饶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人省容。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像燎字,于是被迫代替她去往敵國和親腥椒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容