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'这几种情况,对于其他情况,就简单的把'\'吞掉了 

 1 while (off < end) {  2             aChar = in[off++];  3             if (aChar == '\\') {  4                 aChar = in[off++];  5                 if(aChar == 'u') {  6                     // Read the xxxx 
 7                     int value=0;  8             for (int i=0; i<4; i++) {  9                 aChar = in[off++]; 10                 switch (aChar) { 11                   case '0': case '1': case '2': case '3': case '4': 12                   case '5': case '6': case '7': case '8': case '9': 13                      value = (value << 4) + aChar - '0'; 14                  break; 15               case 'a': case 'b': case 'c': 16                           case 'd': case 'e': case 'f': 17                  value = (value << 4) + 10 + aChar - 'a'; 18                  break; 19               case 'A': case 'B': case 'C': 20                           case 'D': case 'E': case 'F': 21                  value = (value << 4) + 10 + aChar - 'A'; 22                  break; 23               default: 24                               throw new IllegalArgumentException( 25                                            "Malformed \\uxxxx encoding."); 26  } 27  } 28                     out[outLen++] = (char)value; 29                 } else { 30                     if (aChar == 't') aChar = '\t'; 31                     else if (aChar == 'r') aChar = '\r'; 32                     else if (aChar == 'n') aChar = '\n'; 33                     else if (aChar == 'f') aChar = '\f'; 34                     out[outLen++] = aChar; 35  } 36             } else { 37             out[outLen++] = (char)aChar; 38  } 39         }  

解决方法: 
我的解决方法是,自己写个简单的解析 
约定 

    • 每行第一次出现的'='作为分割符(Properties类可以支持key:value格式)
    • key和value都忽略前后空白字符
    • 不对字符串做转义
 1 while((line = buffReader.readLine())!=null){  2     line = line.trim();  3     if(line.startsWith("#") || line.equals("")){// 忽略#开头的注释 
 4         continue;  5  }  6       
 7     int index = line.indexOf('=');  8     if(index <= 0){  9         logger.error("********错误的配置文件格式!********line = " + line); 10         continue; 11  } 12     String key = line.substring(0, index).trim(); 13     String value = (index+1>=line.length()) ? "":line.substring(index+1).trim();// 避免越界 
14  prop.put(key, value); 15 }  

之所以把它记下来是因为我跟同事说起这个现象的时候,同事发现他之前写的代码用过类似的正则表达式配置方式,正则表达式里面希望匹配绝对的'\.',而经过Properties类转义之后变成了'.',意义就变成了“任意字符”,由于运行并不报错,而且某系情况下结果还是正确的,于是一个潜在的bug就出现了 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM