我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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

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

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

动态读取的代码


import java.util.Properties; 

public class demo01 {
 
 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;
 }
}

读取配置文件 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{
 
 // 属性文件位置, 相对路径为class="lazy" data-src/main/resources 或 class="lazy" data-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{
 
 // 属性文件位置, 相对路径为class="lazy" data-src/main/resources 或 class="lazy" data-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); 
}

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 单元测试, 所以笔者的配置文件存放在 class="lazy" data-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");  
 }
}

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java如何获取properties文件内容

在Java中,可以使用Properties类来获取properties文件的内容。具体方法如下:1. 创建Properties对象并加载properties文件,可以使用Properties类的load()方法。```javaPropert
2023-09-13

java web开发中获取tomcat上properties文件内容的方法

在java web开发的时候经常会用到读取读取或存放文件,这个文件的默认路径在哪里呢?写死在程序里面显然是可以的,但这样子不利于位于,假如有一天项目从window移植到linux,或者保存文件的路径变了,就需要去源代码中查找,进行替换,这样
2023-05-31

利用Java如何实现获取properties配置文件

利用Java如何实现获取properties配置文件?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java读取Properties文件Properties类读取Proper
2023-05-31

Java如何实现动态获取文件的绝对路径

本文小编为大家详细介绍“Java如何实现动态获取文件的绝对路径”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java如何实现动态获取文件的绝对路径”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。前言我们知道在 J
2023-07-05

Java实现动态获取文件的绝对路径

我们知道在 Java 中读取一些配置文件信息,是在开发中十分常用的要求。这篇文章就来和大家聊聊Java如何实现动态获取文件的绝对路径,感兴趣的可以了解一下
2023-02-22

Java如何实现properties文件动态修改并自动保存工具类

这篇文章主要为大家展示了“Java如何实现properties文件动态修改并自动保存工具类”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java如何实现properties文件动态修改并自动保存
2023-05-30

TXT文件的内容如何利用Java实现读取

本篇文章为大家展示了TXT文件的内容如何利用Java实现读取,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java读取txt文件内容。可以作如下理解:首先获得一个文件句柄。File file = n
2023-05-31

Java中如何对文件进行遍历并读取内容?(在Java中,如何实现文件的遍历并读取其中的内容?)

本文详细介绍Java中文件遍历和读取内容的方法。包括使用Files.walk()遍历文件系统,按模式过滤遍历结果,以及使用缓冲区读取器和字符流读取文件内容。通过示例代码展示了每种方法的使用,可供参考学习。
Java中如何对文件进行遍历并读取内容?(在Java中,如何实现文件的遍历并读取其中的内容?)
2024-04-02

Java如何获取resources下的文件路径和创建临时文件

这篇文章主要介绍了Java如何获取resources下的文件路径和创建临时文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-12-29

如何实现一个读取xml文件内容的类

这篇文章将为大家详细讲解有关如何实现一个读取xml文件内容的类,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一个读取xml文件内容的类 package project.util.xml;import ja
2023-06-03

如何在phpcms中实现文章内容的自动抓取与更新?(phpcms环境下,如何自动化抓取和更新文章内容?)

PHPCMS中实现文章自动抓取与更新的步骤:配置计划任务。安装“自动内容抓取”扩展。配置抓取规则。关联内容类别。运行计划任务。高级提示:使用代理服务器避免封禁。设置反爬虫机制。过滤重复内容。优化抓取性能。监测抓取结果。
如何在phpcms中实现文章内容的自动抓取与更新?(phpcms环境下,如何自动化抓取和更新文章内容?)
2024-04-02

linux如何实时查看被添加到一个文件中的内容

Linux系统中可通过以下命令实时查看文件新增内容:tail-f<文件路径>此命令可动态显示文件尾部内容,并在文件更新时自动刷新输出。还可使用-n、-q、-s等选项定制显示内容和更新间隔。还可以使用管道结合grep等命令进行过滤搜索。第三方工具如inotifywait、entr、watch等也可用于实时文件监控。
linux如何实时查看被添加到一个文件中的内容
2024-04-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录