java如何实时动态获取properties文件的内容

目录
  • java 实时动态获取properties文件的内容
    • 动态读取的代码
  • Java 读取配置文件 Properties VS ResourceBundle
    • 1. 常用API
    • 2. Properties 解析属性文件
    • 3. ResourceBundle 解析属性文件
    • 4. 属性文件
    • 5. 实战推荐

java 实时动态获取properties文件的内容

用“ClassLoader.getResourceAsStream”读取properties文件时会发现修改了.properties后,即使重新执行,读入的仍为修改前的参数。

此问题的原因在于ClassLoader.getResourceAsStream读入后,会将.properties保存在缓存中,重新执行时会从缓存中读取,而不是再次读取.properties文件。

动态读取的代码

import java.util.Properties;
/**
 * 实时动态获取properties文件的值
 * @author Administrator
 *
 */
public class demo01 {
 /**
  * 根据配置变量实时获取配置文件中的值
  * @param key 配置名
  * @param filePath 配置文件路径名,例如:test.properties
  * @return 配置值
  */
 public static String getCurrentPropertiesValue(String key,String filePath){
  String value="";
  Properties p = new Properties();
  try {
   //非实时动态获取
   //p.load(new InputStreamReader(this.class.getClassLoader().getResourceAsStream(filePath), "UTF-8"));
   //下面为动态获取
   String path = Thread.currentThread().getContextClassLoader().getResource("").getPath();
   InputStream is = new FileInputStream(path +File.separator+ filePath);
   p.load(is);
   value=p.getProperty(key);
  } catch (UnsupportedEncodingException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  return value;
 }
}

Java 读取配置文件 Properties VS ResourceBundle

在java开发中, 对于一些常用的配置性的信息, 通常会采用存放在属性文件中, 因为修改配置文件无须重新编译jar包. 对于属性文件,通常可以使用Properties和ResourceBundle 两个类来解析. 需要注意的是, 默认情况下java工程中的*.properties文件编码格式是ISO-8859-1, Properties和ResourceBundle也是按照ISO-8859-1格式来解析属性文件中字符串的. 所以对于解析包含中文的熟悉文件时,需要额外注意.

  • ResourceBundle: 通常用于解析国际化资源属性文件, 会根据本地环境自动选择对应的国际化资源.
  • Properties: 用来解析普通属性文件

1. 常用API

1.1 Properties 常用API

Properties 继承Hashtable<Object,Object>类.

方法签名 方法描述
public String getProperty(String key 获取属性文件中的Key, 如果key不存在返回Null
public String getProperty(String key, String defaultValue) 获取属性文件中key对象的value, 如果key不存在则返回默认值defaultValue
public Object get(String key) 父类HashTable中的方法, 返回值类型为Object

1.2 ResourceBundle 常用API

ResourceBundle 是一个接口, 默认使用PropertyResourceBundle来解析属性文件.

方法签名 方法描述
public Locale getLocale() 获取本地国际化环境
public Enumeration getKeys() 获取属性文件中所有key
public final String getString(String key) 获取属性文件中key对应的value, 返回值为String, 如果不存在, 则抛出异常
public final Object getObject(String key) 获取属性文件中key对应的value, 返回值为Object, 如果不存在, 则抛出异常

2. Properties 解析属性文件

默认使用ISO-8859-1 解析配置文件中的字符串, 所以会导致中文乱码.

2.1 解析纯英文配置文件

// 默认编码(ISO-8859-1)读取属性文件, 中文乱码
@Test
public void test_properties_en() throws IOException{

 // 属性文件位置, 相对路径为src/main/resources 或 src/test/resources, 不能添加classpath:/前缀
 String propertyFileName = "jdbc.properties";

 // 获取字节流
 InputStream is = getClass().getClassLoader().getResourceAsStream(propertyFileName);

 // 创建属性文件, 并加载文件内容
 Properties properties = new Properties();
 properties.load(is);
 String username = properties.getProperty("jdbc.username");
 String password = properties.getProperty("jdbc.password");
 System.out.println("username:" + username + ", password:" + password);
}

2.2 解析含中文配置文件

默认使用ISO-8859-1, 采用InputStreamReader转换为UTF8字符流.

// 指定读取文件编码方式,支持读取中文
@Test
public void test_properties_zh() throws IOException{

 // 属性文件位置, 相对路径为src/main/resources 或 src/test/resources, 不能添加classpath:/前缀
 String propertyFileName = "jdbc.properties";

 // 获取字节流
 InputStream is = getClass().getClassLoader().getResourceAsStream(propertyFileName);

 // 转换为UTF-8格式字符流
 InputStreamReader isr = new InputStreamReader(is, "UTF-8");

 // 创建属性文件, 并加载文件内容
 Properties properties = new Properties();
 properties.load(isr);
 String username = properties.getProperty("jdbc.username");
 String password = properties.getProperty("jdbc.password");
 System.out.println("username:" + username + ", password:" + password);
}

3. ResourceBundle 解析属性文件

3.1 解析纯英文配置文件

@Test
public void testRb_en() {
 // 资源配置文件,无须写文件后缀名, 默认寻找properties文件
 String bundleName = "jdbc";

 // 设置本地默认环境为英文环境
 Locale.setDefault(Locale.ENGLISH);

 // 指定加载
 ResourceBundle rb = ResourceBundle.getBundle(bundleName);

 String username = rb.getString("jdbc.username");
 String password = rb.getString("jdbc.password");
 System.out.println("username:" + username + ", password:" + password);
}

3.2 解析含中文配置文件

// 处理中文
@Test
public void testRb_zh() {
 // 资源配置文件,无须写文件后缀名, 默认寻找properties文件
 String bundleName = "jdbc";

 // 根据本地默认环境加载资源配置文件
 ResourceBundle rb = ResourceBundle.getBundle(bundleName);
 String username = iso2Utf8(rb.getString("jdbc.username"));
 String password = iso2Utf8(rb.getString("jdbc.password"));
 System.out.println("username:" + username + ", password:" + password);
}
/**
 * @Description iso编码格式字符串转换为UTF8格式
 * @param str iso 编码字符串
 * @return
 * @author zongf
 * @date 2019年1月8日-下午3:55:29
 */
private String iso2Utf8(String str) {
 if(null == str) return null;

 try {
  return new String(str.getBytes("ISO-8859-1"), "UTF-8");
 } catch (UnsupportedEncodingException e) {
  e.printStackTrace();
 }
 return null;
}

4. 属性文件

笔者创建的是maven 工程, 使用的是junit 单元测试, 所以笔者的配置文件存放在 src/test/resources 目录下.

jdbc.properties

jdbc.username=张三
jdbc.password=123456

jdbc_zh.properties

jdbc.username=张三
jdbc.password=123456

jdbc_en.properties

jdbc.username=zhangsan
jdbc.password=123456

5. 实战推荐

笔者认为, 一个设计良好的属性配置类应该是一个常量类, 至少需要符合两个设计原则:

属性一旦设置不可动态修改, 即使在编译环境也不能调用修改方法.

能够直接通过类属性进行访问, 无须通过类对象访问

自动装配属性, 而无须手动解析熟悉文件(spring中可借助自带注解或自定义注解实现)

public class JdbcProperty {
 /** 用户名 */
 public static final String username;

 /** 用户密码 */
 public static final String password;

 // 在Spring应用中,可借助注解或自定义注解进行自动装配,笔者此处只针对一般java应用
 static {

  // 加载属性文件
  ResourceBundle resourceBundle = ResourceBundle.getBundle("jdbc");

  // 初始化属性
  username = resourceBundle.getString("jdbc.username");
  password = resourceBundle.getString("jdbc.password");
 }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

时间: 2021-09-12

Java 读取、获取配置文件.properties中的数据

java获取配置文件.properties中的数据,具体内容如下所示: 方法太多,只写一种比较简单的. 文件test1.properties内容 test1 = 123; test2=3211 Properties prop = new Properties(); prop.load(new FileInputStream("src/test1.properties")); System.out.println(prop.get("test1")); 输出 123;

详解五种方式让你在java中读取properties文件内容不再是难题

一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题.就借此机会把Spring+SpringMVC+Mybatis整合开发的项目中通过java程序读取properties文件内容的方式进行了梳理和分析,先和大家共享. 二.项目环境介绍 Spring 4.2.6.RELEASE SpringMvc 4.2.6.RELEASE Mybatis 3.2.8 Maven 3.3.9 Jdk 1.7 Id

java获取properties属性文件示例

一个属性列表可包含另一个属性列表作为它的"默认值":如果未能在原有的属性列表中搜索到属性键,则搜索第二个属性列表. 因为 Properties 继承于 Hashtable,所以可对 Properties 对象应用 put 和 putAll 方法.但不建议使用这两个方法,因为它们允许调用者插入其键或值不是 String 的项.相反,应该使用 setProperty 方法.如果在"不安全"的 Properties 对象(即包含非 String 的键或值)上调用 stor

Java读取.properties配置文件方法示例

一.介绍 Properties文件在Java中主要为配置文件,文件类型为:.properties,格式为文本文件,内容格式为"键=值" 二.读取 这里我采用的是getResourceAsStream的文件读取方法 如果想要使用这个方法,则需要了解一些基本使用信息: 1.读取文件路径范围:只局限于工程的源文件中 2.文件访问形式:带"/"是绝对路径,不带"/"是相对路径 3.读取文件类型:主要为:.properties文件,.xml文件 三.使用

Java中的几种读取properties配置文件的方式

相信对于一名JAVA开发者开说properties文件一定再熟悉不过了,比如一下配置: config.properties会经常存放一些系统常量,版本号,路径之类的 database.properties存放数据库的连接参数 log4j.properties 日志的一些基本配置 redis.properties 缓存数据库的一些配置 当然前缀是根据用能自行定义的,一般来说文件的内容的格式是"键=值"的格式,文本注释信息可以用"#"来注释,下面来说说开发中如何读写pr

SpringBoot四种读取properties文件的方式(小结)

前言 在项目开发中经常会用到配置文件,配置文件的存在解决了很大一份重复的工作.今天就分享四种在Springboot中获取配置文件的方式. 注:前三种测试配置文件为springboot默认的application.properties文件 #######################方式一######################### com.zyd.type3=Springboot - @ConfigurationProperties com.zyd.title3=使用@Configura

Java读取.properties配置文件的几种方式

Java 开发中,需要将一些易变的配置参数放置再 XML 配置文件或者 properties 配置文件中.然而 XML 配置文件需要通过 DOM 或 SAX 方式解析,而读取 properties 配置文件就比较容易. 介绍几种读取方式: 1.基于ClassLoder读取配置文件 注意:该方式只能读取类路径下的配置文件,有局限但是如果配置文件在类路径下比较方便. Properties properties = new Properties(); // 使用ClassLoader加载propert

java读取properties配置文件的方法

本文实例讲述了java读取properties配置文件的方法.分享给大家供大家参考.具体分析如下: 这两天做java项目,用到属性文件,到网上查资料,好半天也没有找到一个满意的方法能让我读取到.properties文件中属性值,很是郁闷,网上讲的获取属性值大概有以下方法,以下三种方法逐渐优化,以达到最好的效果以下都以date.properties文件为例,该文件放在src目录下,文件内容为: startdate=2011-02-07 totalweek=25 方法一: public class

java简单读取properties配置文件的方法示例

本文实例讲述了java简单读取properties配置文件的方法.分享给大家供大家参考,具体如下: 读取配置文件,小结如下 import java.io.FileNotFoundException; import java.io.IOException; import java.util.Properties; public class loadConf { private Properties prop = new Properties(); private void loadconf() t

Java读取properties配置文件时,出现中文乱码的解决方法

如下所示: public static String getConfig(String key) { Properties pros = new Properties(); String value = ""; try { pros.load(new InputStreamReader(Object.class.getResourceAsStream("/properties.properties"), "UTF-8")); value = pr

Android读取properties配置文件的实例详解

Android读取properties配置文件的实例详解 因为一些配置信息,多处用到的.且以后可能变更的,我想写个.prorperties配置文件给管理起来. 我把配置文件放在了assets文件夹下 appConfig.properties: serverUrl=http://192.168.1.155 import java.io.InputStream; import java.util.Properties; import android.content.Context; /** * 读取

Python读取properties配置文件操作示例

本文实例讲述了Python读取properties配置文件操作.分享给大家供大家参考,具体如下: 工作需要将Java项目的逻辑改为python执行,Java的很多配置文件都是.properties的,文件内容的格式是"键.键.键...=值"的格式例如A.B.C=value1,D.F=value2等.并且"#"用来注视.python没有专门处理properties格式的包,只有处理标准的ini格式的包.所以需要自己写一个python程序来处理.不说了上程序. 这里参考

Python实现读取Properties配置文件的方法

本文实例讲述了Python实现读取Properties配置文件的方法.分享给大家供大家参考,具体如下: JAVA本身提供了对于Properties文件操作的类,项目中的很多配置信息都是放在了Properties文件.但是Python并没有提供操作Properties文件的库,所以,自己动手写个一个可以加载Properties文件的脚本. class Properties: fileName = '' def __init__(self, fileName): self.fileName = fi