Java 操作Properties配置文件详解
1 简介:
JDK提供的java.util.Properties类继承自Hashtable类并且实现了Map接口,是使用一种键值对的形式来保存属性集,其中键和值都是字符串类型。
java.util.Properties类提供了getProperty()和setProperty()方法来操作属性文件,同时使用load()方法和store()方法加载和保存Properties配置文件。
java.util.ResourceBundle类也提供了读取Properties配置文件的方法,ResourceBundle是一个抽象类。
2.Properties中的主要方法
1)load(InputStream inStream):该方法可以从.properties属性文件对应的文件数入流中,加载属性列表到Properties类对象中。load有两个方法的重载:load(InputStream inStream)、load(Reader reader),可根据不同的方式来加载属性文件。
InputStream inStream = TestProperties.class.getClassLoader().getResourceAsStream("demo.properties"); //通过当前类加载器的getResourceAsStream方法获取 //TestProperties当前类名;TestProperties.class.取得当前对象所属的Class对象; getClassLoader():取得该Class对象的类装载器 InputStream in = ClassLoader.getSystemResourceAsStream("filePath"); InputStream inStream = new FileInputStream(new File("filePath")); //从文件获取 InputStream in = context.getResourceAsStream("filePath"); //在servlet中,可以通过context来获取InputStream InputStream inStream = new URL("path").openStream(); //通过URL来获取
读取方法如下:
Properties pro = new Properties(); //实例化一个Properties对象 InputStream inStream = new FileInputStream("demo.properties"); //获取属性文件的文件输入流 pro.load(nStream); inStream.close();
2)store(OutputStream out,String comments):这个方法将Properties类对象的属性列表写入.properties配置文件。如下:
FileOutputStream outStream = new FileOutputStream("demo.properties"); pro.store(outStream,"Comment"); outStream.close();
3 ResourceBundle中的主要方法
通过ResourceBundle.getBundle()静态方法来获取,此方法获取properties属性文件不需要加.properties后缀名。也可以从InputStream中获取ResourceBundle对象。
ResourceBundle resource = ResourceBundle.getBundle("com/xiang/demo");//emo为属性文件名,放在包com.xiang下,如果是放在src下,直接用test即可 ResourceBundle resource1 = new PropertyResourceBundle(inStream); String value = resource.getString("name");
在使用中遇到的问题可能是配置文件的路径,当配置文件不在当前类所在的包下,则需要使用包名限定;若属性文件在src根目录下,则直接使用demo.properties或demo即可。
4 Properties操作实例
import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Properties; /** * Java中Preperties配置文件工具类 * @author shu * */ public class PropsUtil { private String path = ""; private Properties properties ; /** * 默认构造函数 */ public PropsUtil() {} /** * 构造函数 * @param path 传入Properties地址值 */ public PropsUtil(String path) { this.path = path; } /** * 加载properties文件 * @return 返回读取到的properties对象 */ public Properties loadProps(){ InputStream inStream = ClassLoader.getSystemResourceAsStream(path); try { if(inStream==null) throw new FileNotFoundException(path + " file is not found"); properties = new Properties(); properties.load(inStream); inStream.close(); } catch (IOException e) { e.printStackTrace(); } return properties; } /** * 将配置写入到文件 */ public void writeFile(){ // 获取文件输出流 try { FileOutputStream outputStream = new FileOutputStream( new File(ClassLoader.getSystemResource(path).toURI())); properties.store(outputStream, null); outputStream.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 通过关键字获取值 * @param key * @return 返回对应的字符串,如果无,返回null */ public String getValueByKey(String key) { if(properties==null) properties = loadProps(); String val = properties.getProperty(key.trim()); return val; } /** * 通过关键字获取值 * @param key 需要获取的关键字 * @param defaultValue 若找不到对应的关键字时返回的值 * @return 返回找到的字符串 */ public String getValueByKey(String key,String defaultValue){ if(properties==null) properties = loadProps(); return properties.getProperty(key, defaultValue); } /** * 获取Properties所有的值 * @return 返回Properties的键值对 */ public Map<String, String> getAllProperties() { if(properties==null) properties = loadProps(); Map<String, String> map = new HashMap<String, String>(); // 获取所有的键值 Iterator<String> it=properties.stringPropertyNames().iterator(); while(it.hasNext()){ String key=it.next(); map.put(key, properties.getProperty(key)); } /*Enumeration enumeration = properties.propertyNames(); while (enumeration.hasMoreElements()) { String key = (String) enumeration.nextElement(); String value = getValueByKey(key); map.put(key, value); }*/ return map; } /** * 往Properties写入新的键值且保存 * @param key 对应的键 * @param value 对应的值 */ public void addProperties(String key, String value) { if(properties==null) properties = loadProps(); properties.setProperty(key, value); try { writeFile(); } catch (Exception e) { throw new RuntimeException("write fail"); } } /** * 更新配置文件 * @param key 对应的键 * @param value 对应的值 */ public void update(String key,String value){ if(properties==null) properties = loadProps(); if(properties.containsKey(key)) properties.replace(key, value); try { writeFile(); } catch (Exception e) { throw new RuntimeException("write fail"); } } /** * 刪除某一鍵值对 * @param key */ public void deleteByKey(String key){ if(properties==null) properties = loadProps(); if(!properties.containsKey(key)) throw new RuntimeException("not such key"); properties.remove(key); try { writeFile(); } catch (Exception e) { throw new RuntimeException("write fail"); } } /** * 设置path值 * @param path */ public void setPath(String path){ this.path = path; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
浅谈SpringBoot项目如何让前端开发提高效率(小技巧)
这篇文章主要介绍了浅谈SpringBoot项目如何让前端开发提高效率(小技巧),主要介绍了Swagger和Nginx提高效率的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2019-04-04Spring Boot + Thymeleaf + Activiti 快速开发平台项目 附源码
这篇文章主要介绍了Spring Boot + Thymeleaf + Activiti 快速开发平台项目附源码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-04-04解决springMVC 跳转js css图片等静态资源无法加载的问题
下面小编就为大家带来一篇解决springMVC 跳转js css图片等静态资源无法加载的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-10-10IDEA JavaWeb项目启动运行后出现404错误的解决方法
这篇文章主要介绍了IDEA JavaWeb项目启动运行后出现404错误的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-12-12SpringBoot+Quartz实现定时任务的代码模版分享
quartz 是一款开源且丰富特性的Java 任务调度库,用于实现任务调度和定时任务,本文主要和大家分享一个SpringBoot整合Quartz实现定时任务的代码模版,需要的可以参考一下2023-06-06MyBatis-Plus中MetaObjectHandler没生效完美解决
在进行测试时发现配置的MyMetaObjectHandler并没有生效,本文主要介绍了MyBatis-Plus中MetaObjectHandler没生效完美解决,具有一定的参考价值,感兴趣的可以了解一下2023-11-11
最新评论