您好,登录后才能下订单哦!
这篇文章给大家分享的是有关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开发中, 对于一些常用的配置性的信息, 通常会采用存放在属性文件中, 因为修改配置文件无须重新编译jar包. 对于属性文件,通常可以使用Properties和ResourceBundle 两个类来解析. 需要注意的是, 默认情况下java工程中的*.properties文件编码格式是ISO-8859-1, Properties和ResourceBundle也是按照ISO-8859-1格式来解析属性文件中字符串的. 所以对于解析包含中文的熟悉文件时,需要额外注意.
ResourceBundle: 通常用于解析国际化资源属性文件, 会根据本地环境自动选择对应的国际化资源.
Properties: 用来解析普通属性文件
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, 如果不存在, 则抛出异常 | 
默认使用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.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;
}笔者创建的是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
笔者认为, 一个设计良好的属性配置类应该是一个常量类, 至少需要符合两个设计原则:
属性一旦设置不可动态修改, 即使在编译环境也不能调用修改方法.
能够直接通过类属性进行访问, 无须通过类对象访问
自动装配属性, 而无须手动解析熟悉文件(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");  
 }
}感谢各位的阅读!关于“java怎么实时动态获取properties文件的内容”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。