应用场景

有些时候项目中会用到很多路径,并且很可能多个路径在同一个根目录下,那为了方便配置的修改,达到只修改根目录即可达到一改全改的效果,此时就会想到要是有变量就好了;

另外有时候路径中的文件名是不确定的,要靠业务程序运行时去判断文件名应该如何设置,而又希望此文件下的目录名是确定的,那此时用变量也是比较好的解决方式。

示例代码

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内容的更多相关文章

  1. java中获取系统变量

    System.getProperty("java.version") 用来获取系统变量.getProperty()这个方法是获取指定键指示的系统属性的.以下是通过System.ge ...

  2. java中获取系统属性以及环境变量

    java中获取系统属性以及环境变量 System.getEnv()和System.getProperties()的差别 从概念上讲,系统属性 和环境变量 都是名称与值之间的映射.两种机制都能用来将用户 ...

  3. Java中获取键盘输入值的三种方法

    Java中获取键盘输入值的三种方法     Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值 ...

  4. JAVA中获取路径

    内容来自于snannan_268 关键字: java中获取路径 JAVA中获取路径: 1.jsp中取得路径:   以工程名为TEST为例: (1)得到包含工程名的当前页面全路径:request.get ...

  5. JAVA中获取当前系统时间及格式转换

    JAVA中获取当前系统时间   一. 获取当前系统时间和日期并格式化输出: import java.util.Date;import java.text.SimpleDateFormat; publi ...

  6. java中获取日期和时间的方法总结

    1.获取当前时间,和某个时间进行比较.此时主要拿long型的时间值. 方法如下:  要使用 java.util.Date .获取当前时间的代码如下 Date date = new Date(); da ...

  7. JAVA中获取当前系统时间

    一. 获取当前系统时间和日期并格式化输出: import java.util.Date;import java.text.SimpleDateFormat; public class NowStrin ...

  8. java中获取路径中的空格处理(%20)问题

    在java中获取文件路径的时候,有时候会获取到空格,但是在中文编码环境下,空格会变成“%20”从而使得路径错误. 解决办法: String path = Parameter.class.getReso ...

  9. java中的static变量

    java中的static变量 例如 public static int num=0: num+=1;放在函数里面 调用一次变动一次.

随机推荐

  1. Software-Defined Networking:A Comprehensive Survey--Day4

    V. ONGOING RESEARCH EFFORTS AND CHALLENGES 这一节主要介绍了对SDN潜力的发挥有着重要推动作用的一些研究成果. A. Switch Designs 目前Ope ...

  2. Ubuntu18.04 安装后的简单实用设置[未完成]

    1. 安装完成. 2. 更新 sudo apt-get update 3. 修改vi 放置键盘错位的问题 编辑文件/etc/vim/vimrc.tiny 将“compatible”改成“nocompa ...

  3. [转帖]Prometheus+Grafana监控Kubernetes

    原博客的位置: https://blog.csdn.net/shenhonglei1234/article/details/80503353 感谢原作者 这里记录一下自己试验过程中遇到的问题: . 自 ...

  4. Python开发【第七章】:面向对象进阶

    1.静态方法 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类 ...

  5. linux下&、nohup与screen的比较

    & 首先,linux进程是区分前台进程和后台进程的. 通常,在终端输入的命令执行的前台进程模式.如果一个命令要执行好久,就会阻塞住终端好久,不能进行其他工作,所以,我们可以把执行花费时间很长的 ...

  6. MySQL 主从复制详解

    读写分离的意思是,写入的时候向 a 服务器写入,而读出的时候从 b c d 甚至更多的服务器读出:这样的架构适合于读多写少的应用,最典型的就是火车购票系统,一般我们买票的时候要先查询好多次,包括车次啊 ...

  7. 后Hadoop时代的大数据技术思考:数据即服务

    1. Hadoop 的神话正在破灭 IBM leads BigInsights for Hadoop out behind barn. Shots heard IBM has announced th ...

  8. ZOJ 1314 Reactor Cooling | 上下界无源汇可行流

    ZOJ 1314 Reactor Cooling | 上下界无源汇可行流 题意 有一个网络,每条边有流量的上界和下界,求一种方案,让里面的流可以循环往复地流动起来. 题解 上下界无源汇可行流的模型: ...

  9. debian9部署ownCloud

    ownCloud是一个开源的私有云存储,支持外接存储,具有良好的扩展性.ownCloud是传统的C/S架构,支持目前各大流行平台.服务端客户端实时同步,使用体验非常好. ownCloud is Wed ...

  10. go gcc

    http://www.cnblogs.com/zkweb/p/7880099.html