properties修改保留注解,重新加载properties到内存

前两天做一个properties文件的配置管理,其中配置文件的数据加载到java内存中。

首先,启动项目加载Properties文件。

InputStream in = ConfProp.class.getClassLoader().getResourceAsStream("conf.properties");
ConfProp.config = new Properties();

//字符流解决中文乱码问题

BufferedReader bf = new BufferedReader(new InputStreamReader(in,"UTF-8"));  
ConfProp.config.load(bf);

当然也可以使用字节流,主要是配置文件中没有中文即可

//字节流
//ConfProp.config.load(in);

其次,既然是配置文件管理,必须要有查询和更新。

查询:在上边的code中,我们的config是一个Properties对象,而Properties有是key/value的存储方式,

当然也提供了config.getProperty(key);

更新 :我们这里更新分为两个步骤:

1)修改Properties文件,也就是我们上边code中的"conf.properties"文件。

2)修改java内存中Properites对象的值。

下面我详细讲一下,我们处理Properties文件的一些心得吧,也是我们这篇博文的主要目的。

直接进入主题,修改Properties文件常用的方法有两个。

方法一:使用java的Properties对象提供的方法setProperty(key,value)。

(1):获取Properties对象,可以重新加载Properties文件,也可以直接用上述code中的java内存中对象config,调用config.setProperty(key,value);

key是要修改的键,value要修改的值。

(2):第一步修改了java内存中的config对象,接下来我们把修改之后的config对象持久化到Properites文件中。

//要把数据保存到文件,首先要获取文件的路径

String filePath  = ConfProp.class.getClassLoader().getResource("conf.properties").toString();
/
/getResource()方法获取的文件地址一般的格式是 “file:\D:\proj.properties"需要截取地址,还有一点需要注意,如果地址中有空格字符或者中文字符的时候//一定要主要转码替换掉,因为new FileOutPutStream()方法不识别%20这样的字符

filePath = filePath.substring(6).replace("%20", " ");
/
/
使用字符输出流转码UTF-8,一般Properties没有中文不需要用字符流

OutputStreamWriter fos = new OutputStreamWriter(new FileOutputStream(filePath), "UTF-8");  
/
/这是最重要的地方,持久化到文件。

config.store(fos, "这是注解的地方");

这样我们方法一的步骤就结束了,完成了修改java对象的修改和Properties文件的修改。但是这个方法的缺点是修改之后Properties文件所有的key/value顺序都被打乱了,而且开发人员加的注解都没有了,剩余的都是键值对这样的数据,看起来没有没有任何的观赏性,对维护人员后期的维护工作也不利。所以我们就需要考虑别的处理方法,也就是我们第二种方法的由来。

方法二:使用笨办法,虽然笨但是实用。读取文件流,然后用readLine()方法一行一行去解析properties文件的数据。因为properties文件中key/value都是用”=“隔开的,我们可以使用这个特性去处理。下来直接上code。

// 更新配置文件--保留注解-2015年11月13日 17:40:25
public static void set(Map<String,Object> map) {
try {
InputStream in = ConfProp.class.getClassLoader().getResourceAsStream(
"conf.properties");
BufferedReader br = new BufferedReader(new InputStreamReader(in,"UTF-8")); 
StringBuffer outstr = new StringBuffer("");
String line ="";
boolean flag = false;
  
while ((line = br.readLine()) != null) {
if (line == "") // 如果为空
{
outstr.append("\n");
} else {
if (line.startsWith("#")) // 如果为注释
{
outstr.append(line + "\n");
} else {
String _line = line.trim();
int charNum = _line.indexOf("=");
// 判断是否是key/value格式
if (charNum != -1) {
Iterator<String> it = map.keySet().iterator();
boolean find = false;
while (it.hasNext()) {
String key = it.next();
String _key = _line.substring(0, charNum);
// 如果key相同,则更新value
if (_key.equals(key)) {
String _value = map.get(key) + "";
outstr.append( _key + "=" + _value + "\n");
map.remove(key);
flag = true;
find = true;
break;
}
}
if(!find){
outstr.append(line + "\n");
}
}else{
outstr.append(line + "\n");
}
}
}
}
    System.out.println(outstr);
    br.close();
    in.close();
if (flag) {
String filePath  = ConfProp.class.getClassLoader().getResource("conf.properties").toString();
filePath = filePath.substring(6).replace("%20", " ");
OutputStreamWriter fos = new OutputStreamWriter(new FileOutputStream(filePath), "UTF-8"); 
BufferedWriter bw = new BufferedWriter(fos);
bw.write(outstr.toString());
bw.close();
fos.close();
}
} catch (Exception e) {
logger.error("配置信息错误",e);
}
}

根据上述代码我们可以把一批要修改的值进行更新修改。修改完配置文件,我们下来一个任务就是修改java内存中的config对象,当然我们也可以在

上面code的中进行修改,把需要修改的属性值直接使用config.setProperty(key,value)修改。

f (_key.equals(key)) {

//这个位置随便加就行
}

不过我们暂时不用这种方法,以我们要把修改数据文件和加载数据缓存放在两个方法中进行。

这一块我讲一下我当初的编码过程,其实做到现在大多数人会想不就是重新加载config对象嘛,直接使用博文开始时候的加载方式

InputStream in = ConfProp.class.getClassLoader().getResourceAsStream("conf.properties");

//字符流解决中文乱码问题
BufferedReader bf = new BufferedReader(new InputStreamReader(in,"UTF-8"));  
config.load(bf);

这样就可以重新加载了,但是你可以试一下,打印获取到的输入流,加载到的数据根本不是我们修改之后的数据流。所以当初在这里还是比较纠结,只能回去把IO这里重新看了一下,才发现问题所在。问题出在ConfProp.class.getClassLoader().getResourceAsStream("conf.properties");getResourceAsStream读取文件之后,会把文件存在内存缓存中,后边的每一次都是读取内存中的内容了,所以当我们不想重启服务,但是要时时更新加载的话,我们就需要直接用读文件的输出流

String filePath  = ConfProp.class.getClassLoader().getResource("conf.properties").toString();
filePath = filePath.substring(6).replace("%20", " ");
InputStream in = new FileInputStream(filePath); 
BufferedReader bfr = new BufferedReader(new InputStreamReader(in,"UTF-8"));
ConfProp.config.load(bfr);

这样就可以重新加载数据了。

最后,上面基本上把这次Properties文件的一些操作都写了,当然也可能还有其它的方法处理,博主这里没有写到,大家也可以留言一起讨论讨论,欢迎交流。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值