场景:
配置文件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编程中,Properties文件是一种常用的配置文件格式,用于存储应用程序的配置参数或者环境设置。这些文件通常以键值对的形式存在,例如`key=value`。读取Properties文件是Java开发中的常见操作,特别是在需要...
在Java编程中,Properties类是处理配置文件的关键工具,它用于加载、存储键值对,这些键值对常被用于程序的配置。然而,当我们读取一个Properties文件并再次保存时,原始的格式可能会发生变化,比如注释丢失、行顺序...
在Java编程中,读取`.properties`文件是常见的任务,这些文件通常用于存储配置信息,如数据库连接字符串、系统...了解并熟练掌握这些知识点,对于日常的Java开发工作至关重要,特别是在处理配置文件和跨平台应用时。
综上所述,Java Properties文件是Java应用程序中存储配置信息的重要手段,通过`Properties`类提供的API,我们可以方便地读取和管理这些配置数据。了解并熟练运用这一机制对于Java开发者来说是非常基础且重要的。
在Java编程中,读取properties属性文件是一项常见的任务,它主要用于存储配置信息,如数据库连接字符串、系统参数等。Properties文件通常以键值对的形式组织,键和值之间用等号(=)或冒号(:)分隔。这篇博客()...
在Java编程语言中,`Properties`类是处理配置文件的核心工具,这些文件通常以`.properties`为扩展名。这类文件用于存储配置信息,如数据库连接字符串、应用设置等,因为它们提供了一种易于读写键值对的方式。下面将...
在Java编程中,管理应用程序的配置参数是一项...以上就是关于在Java中读取`properties`配置文件的相关知识点,包括文件加载、读取、更新以及最佳实践。了解并熟练掌握这些技巧,将有助于构建更加健壮和灵活的应用程序。
`NewFile.xml`可能是另一种配置文件格式,如XML,它也可以通过Java的`DocumentBuilderFactory`等类进行解析和操作。 总之,`java.util.Properties`类是Java中处理属性文件的重要工具,它的灵活性和易用性使其在各种...
`java.util.Properties`是Java提供的一种用于处理`.properties`文件的类,它可以加载、保存键值对,并提供获取和设置键值的方法。`load()`方法用于从输入流加载键值对,`getProperty()`用于获取特定键对应的值。 4...
标题中的"properties文件修改"指的是在Java开发中对`.properties`配置文件进行编辑和更新的过程。`.properties`文件是Java应用程序中广泛使用的文本文件,用于存储配置信息,如数据库连接字符串、系统设置或其他应用...
在IT行业中,尤其是在软件开发领域,`properties` 文件是一种常见的配置文件格式,广泛应用于Java和其他支持此格式的编程语言中。这些文件主要用于存储程序的配置信息、本地化文本或者其他键值对数据。在本场景中,`...
在Java开发过程中,经常会遇到需要读取资源文件的情况,比如配置文件、属性文件等。这些文件中的内容有时会非常长,或者为了提高可读性,需要进行换行处理。本文将详细介绍如何在Java中正确处理这种场景。 #### 一...
在Java编程语言中,`properties`文件用于存储配置信息,如系统设置、应用程序参数等。这些文件通常以ASCII编码格式编写,但有时需要处理包含中文字符的情况,这就会引发"properties中文问题"。标题提到的问题可能...
properties文件在IT行业中是Java开发中的一个重要组成部分,主要用于存储配置信息和元数据。这些文件以键值对的形式组织,常用于设置程序的属性或者作为国际化(i18n)资源。"properties文件编辑"通常指的是对这些...
在Java编程中,读取和处理配置文件是常见的任务,其中`Properties`类扮演着重要的角色。`java.util.Properties`是Java标准库提供的一种用于处理属性列表的类,常用于管理应用的配置信息,如数据库连接字符串、用户名...
在Java中,我们可以利用`java.util.Properties`类来加载和操作`.properties`文件,如`config.properties`和`configiiff.properties`。这些文件同样包含键值对,但它们遵循Java属性文件的语法,支持特殊字符转义。...
在Java编程语言中,`properties`文件是一种常用的配置文件,用于存储程序的配置信息,如数据库连接字符串、系统参数等。这些文件通常以键值对的形式存在,键和值之间用等号(=)或冒号(:)分隔。在本项目示例中,...
这款插件的发布为开发者提供了强大的工具,帮助他们处理`.properties`文件,这是Java应用程序中常见的用于存储配置信息的文本文件。 在Java开发中,`.properties`文件通常用来保存国际化(i18n)信息、配置设置或...
Spring Boot 使用 i18n 时 properties 文件中文乱码问题的解决方法 Spring Boot 是一个流行的 Java 框架,用于快速开发 Web 应用程序。然而,在使用 Spring Boot 时,遇到中文乱码问题的可能性很高,特别是在使用 ...
Struts框架中的ActionForm乱码问题以及Servlet全局过滤器的转义编码处理是Java Web开发中常见的字符编码问题。在开发基于Struts的Web应用时,乱码主要出现在三个方面:页面显示乱码、参数传递乱码以及国际化资源文件...