`
weiqiang.yang
  • 浏览: 156551 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Java Properties类加载配置文件转义问题

阅读更多
场景:
    配置文件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就出现了
1
1
分享到:
评论
1 楼 beneo 2010-12-23  
赞。。。我就碰到了这个潜在的问题,看来覆盖测试还是非常必要的

相关推荐

    java 读取properties文件代码

    在Java编程中,Properties文件是一种常用的配置文件格式,用于存储应用程序的配置参数或者环境设置。这些文件通常以键值对的形式存在,例如`key=value`。读取Properties文件是Java开发中的常见操作,特别是在需要...

    java修改Properties文件,让输出格式与输入格式保持不变

    在Java编程中,Properties类是处理配置文件的关键工具,它用于加载、存储键值对,这些键值对常被用于程序的配置。然而,当我们读取一个Properties文件并再次保存时,原始的格式可能会发生变化,比如注释丢失、行顺序...

    Java读取.properties文件

    在Java编程中,读取`.properties`文件是常见的任务,这些文件通常用于存储配置信息,如数据库连接字符串、系统...了解并熟练掌握这些知识点,对于日常的Java开发工作至关重要,特别是在处理配置文件和跨平台应用时。

    java Properties文件key,value读取

    综上所述,Java Properties文件是Java应用程序中存储配置信息的重要手段,通过`Properties`类提供的API,我们可以方便地读取和管理这些配置数据。了解并熟练运用这一机制对于Java开发者来说是非常基础且重要的。

    java读取properties属性文件

    在Java编程中,读取properties属性文件是一项常见的任务,它主要用于存储配置信息,如数据库连接字符串、系统参数等。Properties文件通常以键值对的形式组织,键和值之间用等号(=)或冒号(:)分隔。这篇博客()...

    Java对properties文件的操纵

    在Java编程语言中,`Properties`类是处理配置文件的核心工具,这些文件通常以`.properties`为扩展名。这类文件用于存储配置信息,如数据库连接字符串、应用设置等,因为它们提供了一种易于读写键值对的方式。下面将...

    Java那些事儿之(一)读取property配置文件

    在Java编程中,管理应用程序的配置参数是一项...以上就是关于在Java中读取`properties`配置文件的相关知识点,包括文件加载、读取、更新以及最佳实践。了解并熟练掌握这些技巧,将有助于构建更加健壮和灵活的应用程序。

    JAVA属性文件的操作类Propertise

    `NewFile.xml`可能是另一种配置文件格式,如XML,它也可以通过Java的`DocumentBuilderFactory`等类进行解析和操作。 总之,`java.util.Properties`类是Java中处理属性文件的重要工具,它的灵活性和易用性使其在各种...

    android中读取properties文件

    `java.util.Properties`是Java提供的一种用于处理`.properties`文件的类,它可以加载、保存键值对,并提供获取和设置键值的方法。`load()`方法用于从输入流加载键值对,`getProperty()`用于获取特定键对应的值。 4...

    properties文件修改

    标题中的"properties文件修改"指的是在Java开发中对`.properties`配置文件进行编辑和更新的过程。`.properties`文件是Java应用程序中广泛使用的文本文件,用于存储配置信息,如数据库连接字符串、系统设置或其他应用...

    propertiesEditor

    在IT行业中,尤其是在软件开发领域,`properties` 文件是一种常见的配置文件格式,广泛应用于Java和其他支持此格式的编程语言中。这些文件主要用于存储程序的配置信息、本地化文本或者其他键值对数据。在本场景中,`...

    Java读取资源文件时内容过长与换行的处理

    在Java开发过程中,经常会遇到需要读取资源文件的情况,比如配置文件、属性文件等。这些文件中的内容有时会非常长,或者为了提高可读性,需要进行换行处理。本文将详细介绍如何在Java中正确处理这种场景。 #### 一...

    properties 中文问题

    在Java编程语言中,`properties`文件用于存储配置信息,如系统设置、应用程序参数等。这些文件通常以ASCII编码格式编写,但有时需要处理包含中文字符的情况,这就会引发"properties中文问题"。标题提到的问题可能...

    properties 文件编辑

    properties文件在IT行业中是Java开发中的一个重要组成部分,主要用于存储配置信息和元数据。这些文件以键值对的形式组织,常用于设置程序的属性或者作为国际化(i18n)资源。"properties文件编辑"通常指的是对这些...

    java ReadProperties

    在Java编程中,读取和处理配置文件是常见的任务,其中`Properties`类扮演着重要的角色。`java.util.Properties`是Java标准库提供的一种用于处理属性列表的类,常用于管理应用的配置信息,如数据库连接字符串、用户名...

    common-configuration的一些应用

    在Java中,我们可以利用`java.util.Properties`类来加载和操作`.properties`文件,如`config.properties`和`configiiff.properties`。这些文件同样包含键值对,但它们遵循Java属性文件的语法,支持特殊字符转义。...

    properies使用

    在Java编程语言中,`properties`文件是一种常用的配置文件,用于存储程序的配置信息,如数据库连接字符串、系统参数等。这些文件通常以键值对的形式存在,键和值之间用等号(=)或冒号(:)分隔。在本项目示例中,...

    properties editor 6.0.5

    这款插件的发布为开发者提供了强大的工具,帮助他们处理`.properties`文件,这是Java应用程序中常见的用于存储配置信息的文本文件。 在Java开发中,`.properties`文件通常用来保存国际化(i18n)信息、配置设置或...

    spring boot使用i18n时properties文件中文乱码问题的解决方法

    Spring Boot 使用 i18n 时 properties 文件中文乱码问题的解决方法 Spring Boot 是一个流行的 Java 框架,用于快速开发 Web 应用程序。然而,在使用 Spring Boot 时,遇到中文乱码问题的可能性很高,特别是在使用 ...

    STRUTS ActionForm乱码,servlet全局过滤器转义编码。

    Struts框架中的ActionForm乱码问题以及Servlet全局过滤器的转义编码处理是Java Web开发中常见的字符编码问题。在开发基于Struts的Web应用时,乱码主要出现在三个方面:页面显示乱码、参数传递乱码以及国际化资源文件...

Global site tag (gtag.js) - Google Analytics