java配置文件转义问题
场景:
配置文件config.properties
配置项cfg.regexp=\d+\t
加载配置文件代码
InputStream ins = PropManager.class.getResourceAsStream("/config.properties");
prop.load(ins);
现象:
打印cfg.regexp的值输出为"d+ ",而不是期望的"\d+\t"
原因:
看了下代码,发现Properties类对'\'做了转义处理,而且只处理'\uxxxx', '\t','\n','\r','\f'这几种情况,对于其他情况,就简单的把'\'吞掉了
while (off < end) {
aChar = in[off++];
if (aChar == '\\') {
aChar = in[off++];
if(aChar == 'u') {
// Read the xxxx
int value=0;
for (int i=0; i<4; i++) {
aChar = in[off++];
switch (aChar) {
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
value = (value << 4) + aChar - '0';
break;
case 'a': case 'b': case 'c':
case 'd': case 'e': case 'f':
value = (value << 4) + 10 + aChar - 'a';
break;
case 'A': case 'B': case 'C':
case 'D': case 'E': case 'F':
value = (value << 4) + 10 + aChar - 'A';
break;
default:
throw new IllegalArgumentException(
"Malformed \\uxxxx encoding.");
}
}
out[outLen++] = (char)value;
} else {
if (aChar == 't') aChar = '\t';
else if (aChar == 'r') aChar = '\r';
else if (aChar == 'n') aChar = '\n';
else if (aChar == 'f') aChar = '\f';
out[outLen++] = aChar;
}
} else {
out[outLen++] = (char)aChar;
}
}
解决方法:
我的解决方法是,自己写个简单的解析
约定
- 每行第一次出现的'='作为分割符(Properties类可以支持key:value格式)
- key和value都忽略前后空白字符
- 不对字符串做转义
while((line = buffReader.readLine())!=null){
line = line.trim();
if(line.startsWith("#") || line.equals("")){// 忽略#开头的注释
continue;
}
int index = line.indexOf('=');
if(index <= 0){
logger.error("********错误的配置文件格式!********line = " + line);
continue;
}
String key = line.substring(0, index).trim();
String value = (index+1>=line.length()) ? "":line.substring(index+1).trim();// 避免越界
prop.put(key, value);
}
之所以把它记下来是因为我跟同事说起这个现象的时候,同事发现他之前写的代码用过类似的正则表达式配置方式,正则表达式里面希望匹配绝对的'\.',而经过Properties类转义之后变成了'.',意义就变成了“任意字符”,由于运行并不报错,而且某系情况下结果还是正确的,于是一个潜在的bug就出现了
java配置文件转义问题的更多相关文章
- SPRING IN ACTION 第4版笔记-第七章Advanced Spring MVC-002- 在xml中引用Java配置文件,声明DispatcherServlet、ContextLoaderListener
一.所有声明都用xml 1. <?xml version="1.0" encoding="UTF-8"?> <web-app version= ...
- Java配置文件Properties的读取、写入与更新操作
/** * 实现对Java配置文件Properties的读取.写入与更新操作 */ package test; import java.io.BufferedInputStream; import j ...
- 对Java配置文件Properties的读取、写入与更新操作
http://breezylee.iteye.com/blog/1340868 对Java配置文件Properties的读取.写入与更新操作 博客分类: javase properties 对Jav ...
- 实现对Java配置文件Properties的读取、写入与更新操作
/** * 实现对Java配置文件Properties的读取.写入与更新操作 */ package test; import java.io.BufferedInputStream; import j ...
- java字符串转义,把<>转换成<>等字符【原】
java字符串转义,把<>转换成<>等字符 使用的是commons-lang3-3.4 中的StringEscapeUtils类 package test; import ja ...
- java字符转义
之前对java字符转义这一块稍作了解,在这里理理自己主观浅显的理解 这里会谈谈字符编码的是另一种问题和转义没有关系 以下面代码做分析 System.out.println("a". ...
- java配置文件properties,yml,一般文件
JAVA编写配置文件的几种方式: JAVA配置文件,一般都放在resource目录下,无论是下面提到的properties.yml还是普通的txt等文件. 在打成jar包之后,只需要jar包程序就可运 ...
- java转换 HTML字符实体,java特殊字符转义字符串
为什么要用转义字符串? HTML中<,>,&等有特殊含义(<,>,用于链接签,&用于转义),不能直接使用.这些符号是不显示在我们最终看到的网页里的,那如果我们希 ...
- java分享第十六天( java读取properties文件的几种方法&java配置文件持久化:static块的作用)
java读取properties文件的几种方法一.项目中经常会需要读取配置文件(properties文件),因此读取方法总结如下: 1.通过java.util.Properties读取Propert ...
随机推荐
- Easyui tree方法扩展getImperfectCheck
$.extend($.fn.tree.methods, { getImperfectCheck : function (jq) { var checked = jq.find("span.t ...
- 接入qq登录功能出现的问题
在调用qq授权的接口时,出现以上错误. 原因是: 打包的应用签名和第一次上传包的签名不一致造成的 解决方法: 第一种方法:用上次打包apk的keystore重新打包apk,使签名一致. 第二种方法:联 ...
- POI Excel 冷冻线
冷冻线 Sheet.createFreezePane data bar and color scale SheetConditionalFormatting scf = sheet.getSheet ...
- 使用神器MobaXterm连接远程mysql和redis
https://mobaxterm.mobatek.net/download-home-edition.html mysql redis 连接测试 mysql 127.0.0.1 3307 密码使用线 ...
- 解决一个项目里面加载两个同名不同版本的DLL的问题
在config里面这样配置,可以加载不同版本的dll <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com ...
- shell中${}的使用
1. 截断功能${file#*/}: 拿掉第一条/及其左边的字符串:dir1/dir2/dir3/my.file.txt${file##*/}: 拿掉最后一条/及其左边的字符串:my ...
- influxDB选择类函数
1)TOP()函数 作用:返回一个字段中最大的N个值,字段类型必须是长整型或float64类型. 语法: SELECT TOP(<field_key>[,<tag_keys>] ...
- Solr 查询时候关键期 编码问题
背景架构: 中间是dubbo 调用, 其实还是编码问题!没啥大问题!记录下
- flex 均分铺满
<view>充值金额</view> <view class="weui-flex"> <repeat for="{{amount ...
- python系列一:python3基础语法
'''python保留字即关键字,我们不能把它们用作任何标识符名称.Python 的标准库提供了一个 keyword 模块,可以输出当前版本的所有关键字: '''>>> import ...