項(xiàng)目中經(jīng)常會(huì)遇到使用Properties文件朽色,作為配置文件酱酬。這時(shí)就離不開(kāi)對(duì)它進(jìn)行增刪改查操作.
- 整體思路:
- 讀取思路
1、實(shí)例化Properties對(duì)象仆救。
2抒和、創(chuàng)建一個(gè)輸入流inputstream對(duì)象。
3彤蔽、使用load方法讀取輸入流摧莽。
4、返回Properties對(duì)象顿痪。
5镊辕、關(guān)閉流 - 新增思路
1、實(shí)例化Properties對(duì)象蚁袭。
2征懈、創(chuàng)建一個(gè)輸出流對(duì)象(此處主要,是追加模式)揩悄。
3卖哎、使用setProperty方法將屬性寫(xiě)入到Properties對(duì)象。
4删性、使用store方法讀取輸出流寫(xiě)入到文件棉饶。
5、關(guān)閉流镇匀。 - 修改思路
1照藻、實(shí)例化Properties對(duì)象。
2汗侵、創(chuàng)建一個(gè)輸入流對(duì)象幸缕。
3、使用load方法讀取輸入流晰韵。
4发乔、創(chuàng)建一個(gè)輸出流對(duì)象。
5雪猪、遍歷傳入的要修改或新增的記錄集合map栏尚,并使用setProperty(key, map.get(key))方法設(shè)置或者更新value值。
6只恨、使用store方法將輸出流寫(xiě)入到文件(這里要注意译仗,寫(xiě)入方式是覆蓋)
7抬虽、關(guān)閉流 - 刪除思路
與修改思路基本相同,第五步使用remove方法纵菌,刪除key節(jié)點(diǎn)阐污。
- 讀取思路
具體代碼如下:
/**
* @ClassName: GetPropertiesConfigUtils
* Description: 讀取,新增咱圆,修改笛辟,刪除properties配置文件內(nèi)容的工具類(lèi) </br>
* @author: manyu </br>
* address: www.mpmanyu.com
* date: 2021年3月31日 上午9:08:16
*/
public class GetPropertiesConfigUtils {
/**
*
* Title: loadPropertiesFromClassPath </br>
* Description: 靜態(tài)方法,用于返回 properties對(duì)象 序苏,讀取properties文件 <br>
* 例如:
* Properties p = GetPropertiesConfigUtils.loadPropertiesFromClassPath("db.properties");
*
* @param config 配置文件路徑手幢,使用類(lèi)加載器獲得的inputsteam流,所以配置文件必須放到src下忱详,具體路徑問(wèn)題具體分析围来,也可將類(lèi)反射更改為文件輸入流方式
* @return Properties對(duì)象
* @author manyu </br>
* update 2021年3月31日上午9:14:25
*/
public static Properties loadPropertiesFromClassPath(String config) {
Properties p = new Properties();
InputStream in= null;
try {
//使用類(lèi)加載器讀取 properties文件
in = GetPropertiesConfigUtils.class.getClassLoader().getResourceAsStream(config);
p.load(in);
return p;
} catch (IOException e) {
e.printStackTrace();
} finally {
if(in !=null) {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return p;
}
/**
*
* Title: writeProperties
* Description: 向properties文件中添加key-value屬性 </br>
* 1、實(shí)例化Properties對(duì)象 </br>
* 2踱阿、創(chuàng)建一個(gè)輸出流對(duì)象 </br>
* 3管钳、使用setProperty方法將屬性寫(xiě)入到Properties對(duì)象 </br>
* 4、調(diào)用Properties的存儲(chǔ)方法 </br>
* 5软舌、關(guān)閉資源 </br>
* @param path Properties文件路徑
* @param key 添加key
* @param value 添加value
* @author manyu </br>
* update 2021年3月31日下午4:32:07
*/
public static void writeProperties(String path,String key,String value) {
//1
Properties p = new Properties();
//2
FileOutputStream out = null;
try {
//2
out = new FileOutputStream(path,true);// true必須添加才漆,追加數(shù)據(jù),不要覆蓋數(shù)據(jù)
OutputStreamWriter outWriter = new OutputStreamWriter(out, "UTF-8");//引入writer佛点,確保寫(xiě)入的數(shù)據(jù)中文編碼正確
//3
p.setProperty(key, value);
System.out.println("key="+key+" value="+value);
//4
p.store(outWriter,"");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(out!=null) {
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
/**
*
* Title: uploadProperties </br>
* Description: 更新或新增屬性 </br>
* 1醇滥、實(shí)例化Properties對(duì)象 </br>
* 2、創(chuàng)建一個(gè)輸出流對(duì)象用來(lái)讀取配置文件超营,一個(gè)輸出流對(duì)象鸳玩,用來(lái)輸出對(duì)象 </br>
* 3、使用set方法將屬性下入到Properties對(duì)象 </br>
* 4演闭、調(diào)用Properties的存儲(chǔ)方法store </br>
* 5不跟、關(guān)閉資源 </br>
* @param path
* @param map
* @author manyu
* update 2021年4月1日上午9:21:36 </br>
*/
public static void upldatePropertiesbyMap(String path,Map<String, String> map) {
//1
Properties p = new Properties();
//2
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream(path);
//字符流,以u(píng)tf-8編碼讀取
InputStreamReader reader = new InputStreamReader(in,"utf-8");
p.load(in);
System.out.println(p.stringPropertyNames());
//3
for(String key:map.keySet()) {
p.setProperty(key, map.get(key));
}
out = new FileOutputStream(path);//注意要放到properties的load方法之后米碰,否則會(huì)清空文件
OutputStreamWriter writer = new OutputStreamWriter(out,"utf-8");
//4
p.store(writer, "");//comments 是記錄到注釋中的內(nèi)容,可以放空
//5
reader.close();
writer.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if(in!=null) {
in.close();
}
if(out!=null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
*
* Title: removePropertiesbyMap </br>
* Description: 刪除配置文件中的節(jié)點(diǎn)窝革,實(shí)現(xiàn)與update遠(yuǎn)離相同 </br>
* @param path prpperties文件路徑
* @param keys set類(lèi)型,可批量刪除key
* @author manyu </br>
* update 2021年4月1日上午10:35:24
*/
public static void removePropertiesbyMap(String path,Set<String> keys) {
//1
Properties p = new Properties();
//2
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream(path);
//字符流吕座,以u(píng)tf-8編碼讀取
InputStreamReader reader = new InputStreamReader(in,"utf-8");
p.load(in);
//System.out.println(p.stringPropertyNames());//顯示所有的key
//3
for(String key:keys) {
p.remove(key);
}
out = new FileOutputStream(path);//注意要放到properties的load方法之后虐译,否則會(huì)清空文件
OutputStreamWriter writer = new OutputStreamWriter(out,"utf-8");
//4
p.store(writer, "");//comments 是記錄到注釋中的內(nèi)容,可以放空
//5
reader.close();
writer.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if(in!=null) {
in.close();
}
if(out!=null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//例如
/* public static void main(String[] args) {
Properties config = GetPropertiesConfigUtils.loadPropertiesFromClassPath("db.properties");
String driver = config.getProperty("DRIVER");
System.out.println(driver);
}*/
}
測(cè)試代碼如下:
//測(cè)試讀取properties中的key-value數(shù)據(jù)
Properties p = GetPropertiesConfigUtils.loadPropertiesFromClassPath("db.properties");
String driver = p.getProperty("DRIVER");
String user = p.getProperty("URL");
System.out.println("driver="+driver+" "+"user="+user);
//測(cè)試寫(xiě)入Properties中的key-value數(shù)據(jù)
GetPropertiesConfigUtils.writeProperties("dbc.properties", "shen", "yisi");
//測(cè)試更新Properties中的Key-value 數(shù)據(jù)
Map<String, String> map = new HashMap<>();
map.put("DRIVER", "driver123");
map.put("URL", "WWW.BAIDU.COM");
GetPropertiesConfigUtils.upldatePropertiesbyMap("dbc.properties", map);
//測(cè)試刪除Properties中的key-value 數(shù)據(jù)
Set<String> keys = new HashSet<>();
keys.add("URL");
GetPropertiesConfigUtils.removePropertiesbyMap("dbc.properties",keys );