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;放在函数里面 调用一次变动一次.
随机推荐
- Alpha 冲刺八
团队成员 051601135 岳冠宇 051604103 陈思孝 031602629 刘意晗 031602248 郑智文 031602234 王淇 会议照片 项目燃尽图 项目进展 完善各自部分 项目描 ...
- 在PHPStorm中快速插入当前日期
在EditPlus中使用快捷键Ctrl+D即可插入当前日期,但在PHPStorm中似乎没有这样的快捷键,那如何实现快速插入当前日期呢?其实很简单,跟我做一遍你就会了: 目标 为PHPStorm定义一个 ...
- 分布式为什么使用Redis
一 为什么使用 Redis 在项目中使用 Redis,主要考虑两个角度:性能和并发.如果只是为了分布式锁这些其他功能,还有其他中间件 Zookpeer 等代替,并非一定要使用 Redis. 性能: 如 ...
- 【BZOJ3139】[HNOI2013]比赛(搜索)
[BZOJ3139][HNOI2013]比赛(搜索) 题面 BZOJ 洛谷 题解 双倍经验
- 5月14日 绿城育华NOIP巨石杯试卷解析
[题外话] 感谢UBUNTU为保存程序做出贡献:https://paste.ubuntu.com : 感谢洛谷OJ的私人题库保存题面:https://www.luogu.org : 现在我的题解的所有 ...
- Java 泛型类型基础
为什么要使用泛型? 未使用泛型的情况: // 创建列表类 List list = new ArrayList(); // 添加一个类型为 String 的列表元素 list.add("hel ...
- SQL Server 查询性能优化——覆盖索引
覆盖索引又可以称为索引覆盖. 解释一: 就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖. 解释二: 索引是高效找到行的一个方法,当能通过检索索引 ...
- java基础基础总结----- 随机数(产生四个随机数)
前言:在开发的时候经常会遇见,一些验证码登录,其实这些东西,很简单.我曾经开发过一个验证码登录的页面,那时用的插件.但是作为一个合格的开发者,要了解其内部的核心知识,有些东西,可以不深入了解,但是要做 ...
- python的面向对象-类的数据属性和实例的数据属性相结合-无命名看你懵逼不懵逼系列
1. class Chinese: country='China' def __init__(self,name): self.name=name def play_ball(self,ball): ...
- Vue自定义组件插入值
我们自定义组件的时候有时候需要往组件里面插一些内容: //定义一个组件test,插值内容用slog来代替 export default { name: 'test', template:` <d ...