-
2021-04-17 09:18:52
问题: 当我们使用如下语句加载.properties时:
ClassLoader classLoader = this.getClass().getClassLoader();
Properties prop = new Properties();
prop.load(classLoader.getResourceAsStream("/Application.properties"));
会发现修改了.properties后,即使重新执行,读入的仍为修改前的参数。此问题的原因在于ClassLoader.getResourceAsStream读入后,会将.properties保存在缓存中,重新执行时会从缓存中读取,而不是再次读取.properties文件。
解决:
Properties prop = new Properties();
InputStream is = new FileInputStream(绝对路径);
prop.load(is);
此时,FileInputStream不会将.properties保存在缓存中,即可以解决此问题。但另外让人困惑的 一个问题会产生,即绝对路径,会导致程序的通用性不好。这个问题是由于ClassLoader.getResourceAsStream是直接寻找 classes下的文件,FileInputStream则需要用完整的绝对路径。
完美解决:
Properties prop = new Properties();
String path = Thread.currentThread().getContextClassLoader().getResource("").getPath();
InputStream is = new FileInputStream(path + "/VoucherManagement.properties");
此时已无需给出.properties绝对路径,实现动态加载。
更多相关内容 -
java热加载properties文件
2020-01-14 14:54:18配置文件jdbc.properties,这里和java文件放在同一个目录下面.properties文件热部署主要是解决配置文件更改,服务器需要重启的问题. jdbc.properties如下: #mysqlUrl=jdbc:mysql://localhost:3306/pan?serverTime...配置文件jdbc.properties,这里和java文件放在同一个目录下面.properties文件热部署主要是解决配置文件更改,服务器需要重启的问题.
jdbc.properties如下:#mysqlUrl=jdbc:mysql://localhost:3306/pan?serverTimezone=UTC mysqlUrl=it worked!!!~~~zzzzzzzzzzzzz mysqlDriver=com.mysql.cj.jdbc.Driver mysqlUser=root mysqlPassword=root oracleUrl=jdbc:oracle:thin:@localhost:1521:orcl oracleDriver=oracle.jdbc.driver.OracleDriver oracleUser=scott oraclePassword=tiger
初始化IO流读取文件放在static代码块里面,IO流这里以FileReader为例,当然也可以选择FileInputStream.如果文件的最后修改时间大于最近修改时间,表示文件修改过,要重新加载.
package day29jdbc; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.Properties; public class JDBCUtils { public static long lastModifiedTime = 0L; public static File file; public static Properties properties; public static FileReader fileReader; static { file = new File("E:\\IntellijIDEA\\src\\day29jdbc\\jdbc.properties"); properties = new Properties(); try { fileReader = new FileReader(file); properties.load(fileReader); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (fileReader != null) { fileReader.close(); } } catch (IOException e) { e.printStackTrace(); } } } private static boolean isModified() throws IOException { if (file.lastModified() > lastModifiedTime) { lastModifiedTime = file.lastModified(); return true; } return false; } public static void reload() throws IOException { fileReader = new FileReader(file); properties.load(fileReader); fileReader.close(); } public static String getPropVal(String propKey) throws IOException { if (isModified()) { reload(); } String val = properties.getProperty(propKey); return val; } }
测试代码:
package day29jdbc; import java.io.IOException; import java.util.Calendar; public class JDBCUtilsTest { public static void main(String[] args) throws IOException, InterruptedException { int count=0; while (true) { System.out.println(JDBCUtils.getPropVal("mysqlUrl")+" "+ Calendar.getInstance().getTime()); Thread.sleep(3000); if (count == 10) { break; } count++; } } }
启动main方法后,控制台显示结果后,修改并保存jdbc.properties,再观察控制台结果.控制台显示结果随文件更改实时变动,表示测试成功.
-
java加载属性配置properties文件的方法
2021-02-12 15:43:37什么是properties文件属性配置文件,后缀名为 .properties文件中严格按照key=value进行数据参数的填写中文参数值需要转为Unicode编码不区分基本数据类型一个编辑好的aaa.properties文件如下图所示username=rootflag=...什么是properties文件
属性配置文件,后缀名为 .properties
文件中严格按照key=value进行数据参数的填写
中文参数值需要转为Unicode编码
不区分基本数据类型
一个编辑好的aaa.properties文件如下图所示
username=root
flag=true
xm =\u4f60\u597d
age=18
为什么要使用properties文件
设想这么一种场景,当你项目发布上线后,比如连接mysql数据库的端口号需要调整,难道需要重写改代码,打包,发布么?对于一些重要的参数,需要人为经常改变的参数使用一个properties文件来读取,就不用修改代码了,修改完参数,重启web服务器就能实现预期的需求,后面会介绍动态加载properties文件,甚至连重启都不需要了。
使用java加载properties文件的两种方式
使用类的加载器获得输入流加载文件
@Test
/**
* 使用类的加载器获得文件输入流
* @author CC
* @date 2020年3月24日
*/
public void demo1() throws IOException{
Properties prop =new Properties();
InputStream inputstream= TestProp.class.getClassLoader().getResourceAsStream("test/aaa.properties");
prop.load(inputstream);
String username=prop.getProperty("username");
boolean flag=Boolean.valueOf(prop.getProperty("flag"));
String xm=prop.getProperty("xm");
int age =Integer.valueOf(prop.getProperty("age"));
System.out.println( username + " " +flag+" "+xm+" "+age);
}
需要注意的点:
Properties 类是java.util包下的类,同时是Map的实现类,可以直接使用,有机会会介绍!
获取参数prop.getProperty(“key”),这种获得参数的value是字符串的形式,需要按需转换
中文不需要特殊处理,Unicode编码会转化成中文
使用junit的单元测试效果如下:
root true 你好 123
getResourceAsStream()介绍
jdk中对其描述为:返回用于读取指定资源的输入流。
public InputStream getResourceAsStream(String name)
这个指定的资源路径时怎么确定的呢?
如果是java工程则是相对于src的路径
比如:是位于src的根目录下有一个aaa.properties文件,增正确的访问方式如下:
getResourceAsStream("aaa.properties");
比如:是位于src的根目录下有一个test文件夹,里面有一个aaa.properties文件,增正确的访问方式如下:
getResourceAsStream("test/aaa.properties");
使用文件输入流加载文件
@Test
/**
* 使用标准的文件输入流读取文件
* @author CC
* @date 2020年3月24日
*/
public void demo2() throws IOException{
Properties prop =new Properties();
InputStream inputstream= new FileInputStream("src/test/aaa.properties");
prop.load(inputstream);
String username=prop.getProperty("username");
boolean flag=Boolean.valueOf(prop.getProperty("flag"));
String xm=prop.getProperty("xm");
int age =Integer.valueOf(prop.getProperty("age"));
System.out.println( username + " " +flag+" "+xm+" "+age);
}
使用文件输入流的缺点是什么?
文件的相对路径不好确定
一:如果是一个java工程,可以这么访问:
new FileInputStream("src/test/aaa.properties");
二:如果是一个web工程,我们知道在Tomcat的webapps下的工程是没有src路径,所有的src下文件会被编译后放在WEB-INF的classes文件夹下面,显然上面这种访问方式会报FileNotFound的异常
实现动态加载properties文件,不用重启的那种
场景:已经发布的web项目,我想修改参数又不想重启怎么办呢?传统的上面使用类加载器获得输入流的方式,有以下缺点:
修改了.properties后,即使重新执行,读入的仍为修改前的参数。此问题的原因在于ClassLoader.getResourceAsStream读入后,会将.properties保存在缓存中,重新执行时会从缓存中读取,而不是再次读取.properties文件
使用FileInputStream每次从磁盘中的绝对路径获取文件属性,就能解决上述的缺点,但是需要怎样获得文件的绝对路径?
Properties prop =new Properties();
//InputStream inputstream= ImgCheckServlet.class.getClassLoader().getResourceAsStream("aaa.properties");
//获取绝对路径
String path = Thread.currentThread().getContextClassLoader().getResource("").getPath();
System.out.println(path);
InputStream inputstream= new FileInputStream(path+"/aaa.properties");
prop.load(inputstream);
String username=prop.getProperty("username");
boolean flag=Boolean.valueOf(prop.getProperty("flag"));
String xm=prop.getProperty("xm");
int age =Integer.valueOf(prop.getProperty("age"));
System.out.println( username + " " +flag+" "+xm+" "+age);
可以在一个servlet中看看web工程下的调用效果:比如我们改动age=123,在控制台可以看到效果如下,实时生效
root true 你好 123
到此这篇关于java加载属性配置properties文件的方法的文章就介绍到这了,更多相关java properties配置内容请搜索聚米学院以前的文章或继续浏览下面的相关文章希望大家以后多多支持聚米学院!
-
Java 加载Properties文件的六种方式
2021-03-06 02:41:57导读热词下面是编程之家 jb51.cc 通过网络收集整理...使用java.util.Properties类的load()方法示例: InputStream in = lnew BufferedInputStream(new FileInputStream(name));Properties p = new Properties();p.lo...导读热词
下面是编程之家 jb51.cc 通过网络收集整理的代码片段。
编程之家小编现在分享给大家,也给大家做个参考。
1。使用java.util.Properties类的load()方法
示例: InputStream in = lnew BufferedInputStream(new FileInputStream(name));
Properties p = new Properties();
p.load(in);
2。使用java.util.ResourceBundle类的getBundle()方法
示例: ResourceBundle rb = ResourceBundle.getBundle(name,Locale.getDefault());
3。使用java.util.PropertyResourceBundle类的构造函数
示例: InputStream in = new BufferedInputStream(new FileInputStream(name));
ResourceBundle rb = new PropertyResourceBundle(in);
4。使用class变量的getResourceAsStream()方法
示例: InputStream in = JProperties.class.getResourceAsStream(name);
Properties p = new Properties();
p.load(in);
5。使用class.getClassLoader()所得到的java.lang.ClassLoader的getResourceAsStream()方法
示例: InputStream in = JProperties.class.getClassLoader().getResourceAsStream(name);
Properties p = new Properties();
p.load(in);
6。使用java.lang.ClassLoader类的getSystemResourceAsStream()静态方法
示例: InputStream in = ClassLoader.getSystemResourceAsStream(name);
Properties p = new Properties();
p.load(in);
补充
Servlet中可以使用javax.servlet.ServletContext的getResourceAsStream()方法
示例:InputStream in = context.getResourceAsStream(path);
Properties p = new Properties();
p.load(in);
以上是编程之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
相关文章
总结
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250
-
java动态加载配置文件
2021-12-09 20:14:38项目启动时需要从一些配置文件中加载相关配置,在运行过程中,希望修改配置文件的内容,可以重新加载配置。 下面会提供一个基本示例,仅供参考。 -
JAVA实现热加载配置文件(不重启服务器加载配置文件)
2020-03-20 17:38:37通过文件的当前时间和上次修改时间做比较,判断是否需要重新读取文件,从而实现不重启服务器获取修改后的参数 package com.shp.util; import java.io.File; import java.io.FileInputStream; import java.io.... -
Java热加载(JRebel)与Devtools热部署
2021-03-16 22:23:16本文主要介绍两种热部署方式:Jrebel与devtools一、热部署与热...二、实现原理热加载的实现原理主要依赖java的类加载机制,在实现方式可以概括为在容器启动的时候起一条后台线程,定时的检测类文件的时间戳变化,如... -
springBoot(4)—热部署,配置文件使用
2021-03-21 10:05:49热部署,配置文件使用一、热加载spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用。devtools的原理深层原理是使用了两个... -
SpringMVC加载配置Properties文件的几种方式
2021-08-04 01:28:50最近开发的项目使用了SpringMVC的框架,用下来感觉SpringMVC的代码实现的非常优雅,功能也非常强大,网上介绍Controller参数绑定、URL映射的文章都很多了,写这篇博客主要总结一下SpringMVC加载配置Properties文件的... -
Java配置文件Properties的读取、写入与更新操作
2021-03-08 20:58:57/***实现对Java配置文件Properties的读取、写入与更新操作*/packagetest;importjava.io.BufferedInputStream;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;... -
JVM热加载技术的解决方案
2021-03-09 21:00:48目前的HotReload方案目前一般是容器(WebContainer/Framework)才有能力做到热加载。因为通过自定义的ClassLoader实例来管理(bean/page/controller/configuration),如果这些文件有变化,立即创建一个新的ClassLoader... -
log4j.properties配置与加载应用
2021-03-08 17:24:35log4j.properties总结:一、介绍Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务 器、NT的事件记录器、UNIX Syslog守护进程等;... -
热加载Properties 工具类
2016-05-16 22:05:30项目中经常会出现更改某个配置项后,很无奈的要重启服务使其生效,因此写下此工具类。 主体思想是建立一个守护线程每隔一段时间重新加载一下配置项 -
详解tomcat热部署和热加载的方法
2021-03-17 15:50:10详解tomcat热部署和热加载的方法我在项目开发过程中,经常要改动Java/JSP 文件,但是又不想从新启动服务器(服务器从新启动花时间),想直接获得(debug)结果.有两种方式热部署 和热加载:1.热加载:在server.xml ->... -
不停服热加载java代码
2018-06-25 17:16:12这个jar的名字是在sys.properties文件中的sys.hotdeploy.jarfile属性配置的. 3.接下来是怎么把jar包部署到外网上去.为了方便,没有搞一个新的流程,而是借用了已有的reload机制,通过xml指定要热加载的类,然后读取xml... -
Springboot热加载和配置文件
2020-02-14 20:07:43热加载 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true<... -
Nacos Spring Cloud 实现配置热加载
2021-07-13 12:09:430x03:Nacos 配置热加载 1. 添加依赖 com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config 2. 在 resources 文件夹添加 bootstrap.properties 配置文件 # 服务名 spring.application.name=mall_... -
spring热加载(隔一段时间加载properties等文件)ReloadableResourceBundleMessageSource
2016-03-05 12:05:071.先配置application context(地址有两种classpath:,file:) ...pre name="code" class="java"class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property na... -
使用commons-configuration2读取properties、yaml、xml配置文件,实现配置文件的热更新【享学Java】
2019-06-10 15:07:12`Commons Configuration`作为一个优秀的配置管理库,凭借着优秀的设计以及提供了热加载等使用功能,被不少其它组件作为基础配置管理组件使用,流行度较高。 从2004年发展至今,它一共有两个大版本:1.x和2.x。这两个... -
java属性文件properties常用操作工具类
2021-03-17 19:31:59对于java.util.Properties类,通常我们只需要做到以下3个学习目标:1、认识properties文件,理解其含义,会正确创建properties文件。2、会使用java.util.Properties类来操作properties文件。3、掌握相对路径,能正确... -
SpringBoot常用配置,引入外部配置文件信息,热加载
2021-03-12 08:48:41SpringBoot的配置文件支持properties和yml,甚至还支持json. 更推荐使用yml文件格式: yml文件,会根据换行和缩进帮助咱们管理配置文件所在位置. yml文件,相比properties更轻量级一些 yml文件的劣势: 严格遵守... -
presto热加载catalog配置
2021-12-28 17:20:36presto启动从远程获取catalog配置做加载 启动类Server的代码变更 try { Injector injector = app.strictConfig().initialize(); logLocation(log, "Working directory", Paths.get(".")); logLocation(log, ... -
springcloud config实现配置热加载(简易版本)
2020-05-26 18:08:04前言: 准备:git搭建(新建gateway.properties) springboot:2.3.0 springcloud:Hoxton.SR4 ...启动文件开启配置中心,引入配置@EnableConfigServer启动即可 浏览器访问localhost:888... -
JVM:Java类加载及类加载器
2022-04-21 17:23:17JVM:Java类加载、类加载器、双亲委派模型、破坏双亲委派模型 -
【SpringBoot】47、SpringBoot中如何静态加载配置文件
2021-03-24 22:09:01我们知道在 SpringBoot 中有默认的配置文件 application.yml 或 application.properties,我们可以通过 @ConfigurationProperties(prefix = “test”) 或 @Value("${test}") 等方式获取到配置内容,那有的时候我们... -
关于javaWeb中配置文件读取路径(classPath与类加载器的关系/Resource),以及读取Properties文件的方法
2019-08-01 09:38:361. 关于ClassPath 在早期配置JDK时,我们常常需要配置classpath...jvm在进行类的加载时,AppClassLoader会从所有classpath目录下搜索类(在双亲委托机制下,只有当BootstrapClassPath和ExtClassLoader无法找到类时... -
springboot mybatis 热加载mapper.xml文件(最简单)
2018-06-04 16:26:32今天介绍一下springboot mybatis 热加载mapper.xml文件。 本来不打算写的,看到网上比较流行的方式都比较麻烦,想着简化一下。 网上流行的版本。 https://www.cnblogs.com/oskyhg/p/8587701.html 总结...