场景: 
    配置文件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就出现了

java配置文件转义问题的更多相关文章

  1. SPRING IN ACTION 第4版笔记-第七章Advanced Spring MVC-002- 在xml中引用Java配置文件,声明DispatcherServlet、ContextLoaderListener

    一.所有声明都用xml 1. <?xml version="1.0" encoding="UTF-8"?> <web-app version= ...

  2. Java配置文件Properties的读取、写入与更新操作

    /** * 实现对Java配置文件Properties的读取.写入与更新操作 */ package test; import java.io.BufferedInputStream; import j ...

  3. 对Java配置文件Properties的读取、写入与更新操作

    http://breezylee.iteye.com/blog/1340868 对Java配置文件Properties的读取.写入与更新操作 博客分类: javase properties  对Jav ...

  4. 实现对Java配置文件Properties的读取、写入与更新操作

    /** * 实现对Java配置文件Properties的读取.写入与更新操作 */ package test; import java.io.BufferedInputStream; import j ...

  5. java字符串转义,把&lt;&gt;转换成<>等字符【原】

    java字符串转义,把<>转换成<>等字符 使用的是commons-lang3-3.4 中的StringEscapeUtils类 package test; import ja ...

  6. java字符转义

    之前对java字符转义这一块稍作了解,在这里理理自己主观浅显的理解 这里会谈谈字符编码的是另一种问题和转义没有关系 以下面代码做分析 System.out.println("a". ...

  7. java配置文件properties,yml,一般文件

    JAVA编写配置文件的几种方式: JAVA配置文件,一般都放在resource目录下,无论是下面提到的properties.yml还是普通的txt等文件. 在打成jar包之后,只需要jar包程序就可运 ...

  8. java转换 HTML字符实体,java特殊字符转义字符串

    为什么要用转义字符串? HTML中<,>,&等有特殊含义(<,>,用于链接签,&用于转义),不能直接使用.这些符号是不显示在我们最终看到的网页里的,那如果我们希 ...

  9. java分享第十六天( java读取properties文件的几种方法&java配置文件持久化:static块的作用)

     java读取properties文件的几种方法一.项目中经常会需要读取配置文件(properties文件),因此读取方法总结如下: 1.通过java.util.Properties读取Propert ...

随机推荐

  1. 游戏开发之coco2dx ---简化提炼tolua

    http://www.cnblogs.com/gl5773477/p/4234613.html

  2. mac os 10.10.4 上安装mysql5.6.26

    在 Mac 系统上, 安装 MySQL Server 通常是用 DMG 包在图形化界面下按提示安装, 此外 MySQL 还提供了 Compressed TAR Archive 二进制包安装方式, 即免 ...

  3. json responseJson

    private void doResoponseJson(HttpServletResponse resp,String jsonString){ Trace.logError(Trace.COMPO ...

  4. unison+inotify 同步web代码并排除指定目录不同步

    unison + inotify  实现web 数据双向同步   unison 是一款跨平台的文件同步对象,不仅支撑本地对本地同步,也支持通过SSH,RSH和Socket 等网络协议进行同步.unis ...

  5. FZU 1063 三维扫描(三维连通块)

    Accept: 415    Submit: 1291 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description 工业 ...

  6. border inset outset ,border-radius

    1. 例子: div{ width:256px; height:256px; border: 10px inset #f00; margin:0 auto; border-radius:255px; ...

  7. Django基础流程

    软件环境: Pycharm 2018.1 Python 3.6 Django 2.0.3 1.新建项目 直接使用Pycharm的菜单来创建项目,命名为mysite. mysite mysite __i ...

  8. iOS10通知框架UserNotifications

    在iOS10上,苹果将原来散落在UIKit中各处的用户通知相关的代码进行重构,剥离,打造了一个全新的通知框架-UserNotifications.笔者最近在开发公司通知相关的需求,跟着WWDC2016 ...

  9. java 对象与二进制互转

    来自 : http://blog.csdn.net/luckyzhoustar/article/details/50402427 /** * @FileName: ByteToObject.java ...

  10. 安卓手机开机键失灵,FASTBOOT模式ADB重启

    安装ADB工具 CMD指令fastboot reboot