Java程式碼讀取properties組態檔

2023-05-03 06:01:07

讀取properties組態檔

package com.easycrud.utils;

import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @BelongsProject: EasyCrud
 * @BelongsPackage: com.easycrud.utils
 * @Author: xpx
 * @Email: [email protected]
 * @CreateTime: 2023-05-02  16:05
 * @Description: 讀取properties組態檔工具類
 * @Version: 1.0
 */

public class PropertiesUtils {
    private static Properties props = new Properties();
    private static Map<String,String> PROPER_MAP = new ConcurrentHashMap<String, String>();

    /**
     * 專案初始化時就去讀取組態檔
     */
    static {
        InputStream is = null;
        try{
            is = PropertiesUtils.class.getClassLoader().getResourceAsStream("application.properties");
            props.load(is);

            Iterator<Object> iterator = props.keySet().iterator();
            while (iterator.hasNext()){
                String key = (String) iterator.next();
                PROPER_MAP.put(key,props.getProperty(key));
            }
        }catch (Exception e){

        }finally {
            if (is != null){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 對外提供方法通過key取值
     * @param key
     * @return
     */
    public static String getString(String key) {
        return PROPER_MAP.get(key);
    }

    /**
     * 測試能否成功取值
     * @param args
     */
    public static void main(String[] args) {
        System.out.println("測試列印:"+getString("db.driver.name"));
    }
}

新手引導

Properties

Properties 繼承於 Hashtable。表示一個持久的屬性集.屬性列表中每個鍵及其對應值都是一個字串。

ConcurrentHashMap

HashTable是一個執行緒安全的類,它使用synchronized來鎖住整張Hash表來實現執行緒安全,即每次鎖住整張表讓執行緒獨佔,相當於所有執行緒進行讀寫時都去競爭一把鎖,導致效率非常低下。ConcurrentHashMap可以做到讀取資料不加鎖,並且其內部的結構可以讓其在進行寫操作的時候能夠將鎖的粒度保持地儘量地小,允許多個修改操作並行進行,其關鍵在於使用了鎖分段技術。它使用了多個鎖來控制對hash表的不同部分進行的修改。對於JDK1.7版本的實現, ConcurrentHashMap內部使用段(Segment)來表示這些不同的部分,每個段其實就是一個小的Hashtable,它們有自己的鎖。只要多個修改操作發生在不同的段上,它們就可以並行進行。JDK1.8的實現降低鎖的粒度,JDK1.7版本鎖的粒度是基於Segment的,包含多個HashEntry,而JDK1.8鎖的粒度就是HashEntry(首節點)。

static

static程式碼塊一般用於初始化類中的靜態變數,該靜態程式碼塊在類載入過程中的初始化階段執行,並且只執行一次。

InputStream

位元組輸入流。

try...cache...finally

try{

​ 可能發生異常的程式碼

}catch(可能發生的異常型別 異常物件名){

​ 當前異常型別的處理方式

}finally{

​ 一定要執行的程式碼

}

IOException

IOException 是在使用流、檔案和目錄存取資訊時引發的異常的基礎類別

e.printStackTrace()

在命令列列印異常資訊在程式中出錯的位置及原因。

Class.getClassLoader().getResourceAsStream()

Class是當前類的Class物件,Class.getClassLoader()是獲取當前類的類載入器。類載入器的大概作用是當需要使用一個類時,載入該類的".class"檔案,並建立對應的class物件,將class檔案載入到虛擬機器器的記憶體。getResourceAsStream()是獲取資源的輸入流。類載入器預設是從classPath路徑載入資源。

load()

Properties的方法是逐行讀取properties組態檔,分隔成兩個字串key和value,將他們放進Properties物件中。

Iterator

迭代器 it 的三個基本操作是 next 、hasNext 和 remove。

呼叫 it.next() 會返回迭代器的下一個元素,並且更新迭代器的狀態。

呼叫 it.hasNext() 用於檢測集合中是否還有元素。

呼叫 it.remove() 將迭代器返回的元素刪除。

keySet()

如果有一個Map物件,可以使用 map.keySet()方法獲取所有的key值。

A=xxx.iterator()

獲取迭代器儲存在A中。