Java中获取包含变量的配置文件config.properties内容
应用场景
有些时候项目中会用到很多路径,并且很可能多个路径在同一个根目录下,那为了方便配置的修改,达到只修改根目录即可达到一改全改的效果,此时就会想到要是有变量就好了;
另外有时候路径中的文件名是不确定的,要靠业务程序运行时去判断文件名应该如何设置,而又希望此文件下的目录名是确定的,那此时用变量也是比较好的解决方式。
示例代码
config.properties 如下
#根目录
root_path = D:/myroot #用户目录
users_path = ${root_path}/users #用户相册目录
pictures_path = ${users_path}/{username}/pictures/{year}/{month}/{date} #用户文件目录
files_path = ${users_path}/{username}/files/{year}/{month}/{date} #系统日志文件
logs_path = ${root_path}/logs
说明:${root_path}形式的作为配置文件中路径变量;{year}形式的作为运行时替换的字段。
PropertiesUtil 工具类如下,用于配置文件值和转化变量
package com.tz.util; import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;
import java.util.Map;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern; /**
*
* @author tianzhen
*
*/
public enum PropertiesUtil { ROOT_PATH("root_path"),
USERS_PATH("users_path"),
PICTURES_PATH("pictures_path"),
FILES_PATH("files_path"),
LOGS_PATH("logs_path"); private String title;
private static Properties props;
private PropertiesUtil(String title){
this.title = title;
} private static final String PROPERTIES = "config.properties"; private static final Pattern PATTERN = Pattern.compile("\\$\\{([^\\}]+)\\}"); static{
try {
props = new Properties();
InputStream ins = PropertiesUtil.class.getClassLoader().getResourceAsStream(PROPERTIES);
props.load(ins);
ins.close();
} catch (IOException e) {
e.printStackTrace();
}
} private String getTitle() {
return title;
} public static String getTranslate(PropertiesUtil prop, Map<String, String> params){
String path = get(prop);
if(path==null||path.equals("")){
return "";
}
if(params!=null && !params.keySet().isEmpty()){
//需要替换的字段均放入map中,包括需要替换的日期
for(String key : params.keySet()){
path = path.replace("{"+key+"}", params.get(key));
}
} //如不指定日期,则替换为当前日期
Calendar cal = Calendar.getInstance();
path = path.replace("{year}", cal.get(Calendar.YEAR)+"")
.replace("{month}", cal.get(Calendar.MONTH)+1>9?cal.get(Calendar.MONTH)+1+"":"0"+(cal.get(Calendar.MONTH)+1))
.replace("{date}", cal.get(Calendar.DATE)>9?cal.get(Calendar.DATE)+"":"0"+cal.get(Calendar.DATE)); return path;
} public static String get(PropertiesUtil prop){
String value = props.getProperty(prop.getTitle());
return value==null?null:loop(value);
} @SuppressWarnings("static-access")
private static String loop(String key){
//定义matcher匹配其中的路径变量
Matcher matcher = PATTERN.matcher(key);
StringBuffer buffer = new StringBuffer();
boolean flag = false;
while (matcher.find()) {
String matcherKey = matcher.group(1);//依次替换匹配到的路径变量
String matchervalue = props.getProperty(matcherKey);
if (matchervalue != null) {
matcher.appendReplacement(buffer, matcher.quoteReplacement(matchervalue));//quoteReplacement方法对字符串中特殊字符进行转化
flag = true;
}
}
matcher.appendTail(buffer);
//flag为false时说明已经匹配不到路径变量,则不需要再递归查找
return flag?loop(buffer.toString()):key;
} }
测试代码如下
package com.tz.test; import java.util.HashMap;
import java.util.Map; import com.tz.util.PropertiesUtil; public class Test { public static void main(String[] args) {
System.out.println("********无参取路径***********");
System.out.println(" [root_path] "+PropertiesUtil.get(PropertiesUtil.ROOT_PATH));
System.out.println(" [users_path] "+PropertiesUtil.get(PropertiesUtil.USERS_PATH));
System.out.println("[pictures_path] "+PropertiesUtil.get(PropertiesUtil.PICTURES_PATH));
System.out.println(" [files_path] "+PropertiesUtil.get(PropertiesUtil.FILES_PATH));
System.out.println(" [logs_path] "+PropertiesUtil.get(PropertiesUtil.LOGS_PATH)); System.out.println("\n********无参转化取路径***********");
System.out.println(" [root_path] "+PropertiesUtil.getTranslate(PropertiesUtil.ROOT_PATH , null));
System.out.println(" [users_path] "+PropertiesUtil.getTranslate(PropertiesUtil.USERS_PATH, null));
System.out.println("[pictures_path] "+PropertiesUtil.getTranslate(PropertiesUtil.PICTURES_PATH, null));
System.out.println(" [files_path] "+PropertiesUtil.getTranslate(PropertiesUtil.FILES_PATH, null));
System.out.println(" [logs_path] "+PropertiesUtil.getTranslate(PropertiesUtil.LOGS_PATH, null)); System.out.println("\n********带参转化取路径***********");
Map<String, String> map = new HashMap<String, String>();
map.put("username", "tianzhen");
map.put("year", "2017");
map.put("month", "01");
map.put("date", "02"); System.out.println(" [root_path] "+PropertiesUtil.getTranslate(PropertiesUtil.ROOT_PATH , map));
System.out.println(" [users_path] "+PropertiesUtil.getTranslate(PropertiesUtil.USERS_PATH, map));
System.out.println("[pictures_path] "+PropertiesUtil.getTranslate(PropertiesUtil.PICTURES_PATH, map));
System.out.println(" [files_path] "+PropertiesUtil.getTranslate(PropertiesUtil.FILES_PATH, map));
System.out.println(" [logs_path] "+PropertiesUtil.getTranslate(PropertiesUtil.LOGS_PATH, map));
} }
结果截图:

Java中获取包含变量的配置文件config.properties内容的更多相关文章
- java中获取系统变量
System.getProperty("java.version") 用来获取系统变量.getProperty()这个方法是获取指定键指示的系统属性的.以下是通过System.ge ...
- java中获取系统属性以及环境变量
java中获取系统属性以及环境变量 System.getEnv()和System.getProperties()的差别 从概念上讲,系统属性 和环境变量 都是名称与值之间的映射.两种机制都能用来将用户 ...
- Java中获取键盘输入值的三种方法
Java中获取键盘输入值的三种方法 Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值 ...
- JAVA中获取路径
内容来自于snannan_268 关键字: java中获取路径 JAVA中获取路径: 1.jsp中取得路径: 以工程名为TEST为例: (1)得到包含工程名的当前页面全路径:request.get ...
- JAVA中获取当前系统时间及格式转换
JAVA中获取当前系统时间 一. 获取当前系统时间和日期并格式化输出: import java.util.Date;import java.text.SimpleDateFormat; publi ...
- java中获取日期和时间的方法总结
1.获取当前时间,和某个时间进行比较.此时主要拿long型的时间值. 方法如下: 要使用 java.util.Date .获取当前时间的代码如下 Date date = new Date(); da ...
- JAVA中获取当前系统时间
一. 获取当前系统时间和日期并格式化输出: import java.util.Date;import java.text.SimpleDateFormat; public class NowStrin ...
- java中获取路径中的空格处理(%20)问题
在java中获取文件路径的时候,有时候会获取到空格,但是在中文编码环境下,空格会变成“%20”从而使得路径错误. 解决办法: String path = Parameter.class.getReso ...
- java中的static变量
java中的static变量 例如 public static int num=0: num+=1;放在函数里面 调用一次变动一次.
随机推荐
- 使用Arduino驱动基于ST7533芯片的TFT屏
在合宙通信买了一个1.8寸的TFT屏,驱动芯片是ST7533,本来打算使用Air800直接驱动,但由于其他原因,放弃了.于是尝试使用arduino驱动,为了屏幕刷新速度更快,采用硬件SPI. 硬件连接 ...
- image 样式设置
.image-fluid:响应式大小 .image-thumbnails:照片四周会出现一个1px宽的边框 .figure:用于<figure>标签,用来标记一个图像 .figure-ca ...
- this 指向问题
你不懂JS: this 与对象原型 第二章: this豁然开朗! 在第一章中,我们摒弃了种种对this的误解,并且学习了this是一个完全根据调用点(函数是如何被调用的)而为每次函数调用建立的绑定. ...
- Docker(二十五)-Docker Machine
Docker Machine 是什么? Docker Machine 是 Docker 官方提供的一个工具,它可以帮助我们在远程的机器上安装 Docker,或者在虚拟机 host 上直接安装虚拟机并在 ...
- Windows 下 Docker 的简单学习使用过程之二 Docker For windows
1. Docker For windows 最新版也支持到了 docker ce 18.06 (这个博客的编写时间是 2018.8.17 当时是最新的) 2. 下载安装. 大概500m 左右的安装文件 ...
- ehcache、redis应用场景比较
应用场景: ehcache是Hibernate中默认的CacheProvider,直接在jvm虚拟机中缓存,速度快,效率高:但是缓存共享麻烦,集群分布式应用不方便. . 缓存数据有两级:内存和磁盘, ...
- Sublime Text 3 插件整理
Sublime Text作为一个尽为人知的代码编辑器,其优点不用赘述.界面整洁美观.文本功能强大,且运行速度极快,非常适合编写代码,写文章做笔记.Sublime Text还支持Mac.Windows和 ...
- IDEA 修改 jdk 版本
3步 一 file--setting 二 file--Project Structure 三 file--Project Structure
- kubernetes部署
[自动安装] 一:操作环境 操作系统 centos7 防火墙selinux #systemctl stop firewalld && systemctl disable fire ...
- 【BZOJ4800】[Ceoi2015]Ice Hockey World Championship (meet in the middle)
[BZOJ4800][Ceoi2015]Ice Hockey World Championship (meet in the middle) 题面 BZOJ 洛谷 题解 裸题吧,顺手写一下... #i ...