[英]How do you escape colon (:) in Properties file?
我正在使用属性文件来存储我的应用程序的配置值。 在其中一种情况下,我必须将值存储为xxx:yyy:zzz
。 当我这样做时,冒号用反斜杠\\
转义,导致属性文件中的值显示为xxx\\:yyy\\:zzz
。
我知道冒号:
是Properties
Java 类的标准分隔符。 但是我仍然需要保存没有反斜杠\\
的值。
有关如何处理此问题的任何建议?
将属性放入Properties
对象并使用store(...)
方法保存它。 该方法将执行任何所需的转义。 Java 文档说:
"... 对于键,所有空格字符都以 \\ 字符开头。对于元素,前导空格字符,但不包括嵌入或尾随空格字符,以 \\ 字符开头。键和元素字符 #, !、= 和 : 用前面的反斜杠写入,以确保它们被正确加载。”
如果您手动创建/写入文件,则只需要手动转义字符。
相反,如果您希望文件包含未转义的冒号字符,那您就不走运了。 这样的文件格式错误,可能无法使用Properties.load(...)
方法正确加载。 如果您沿着这条路线走下去,您将需要实现自己的自定义加载和/或存储方法。
我遇到了同样的问题。 正斜杠/
也被Properties
的store()
方法转义。
我创造我自己的解决了这个问题CustomProperties
类(延伸java.util.Properties
)和注释掉调用saveConvert()
在customStore0()
方法。
这是我的CustomProperties
类:
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.Date;
import java.util.Enumeration;
import java.util.Properties;
public class CustomProperties extends Properties {
private static final long serialVersionUID = 1L;
@Override
public void store(OutputStream out, String comments) throws IOException {
customStore0(new BufferedWriter(new OutputStreamWriter(out, "8859_1")),
comments, true);
}
//Override to stop '/' or ':' chars from being replaced by not called
//saveConvert(key, true, escUnicode)
private void customStore0(BufferedWriter bw, String comments, boolean escUnicode)
throws IOException {
bw.write("#" + new Date().toString());
bw.newLine();
synchronized (this) {
for (Enumeration e = keys(); e.hasMoreElements();) {
String key = (String) e.nextElement();
String val = (String) get(key);
// Commented out to stop '/' or ':' chars being replaced
//key = saveConvert(key, true, escUnicode);
//val = saveConvert(val, false, escUnicode);
bw.write(key + "=" + val);
bw.newLine();
}
}
bw.flush();
}
}
几天前我们遇到了这个问题。 我们使用 URL 作为值来操作现有的属性文件。
这是有风险的,但如果您的属性值少于 40 个字符,那么您可以使用“list”方法而不是“store”:
http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html#list(java.io.PrintWriter)
我们快速浏览了 JDK 代码并修改了一个适用于我们目的的 store 的自定义实现:
public void store(Properties props, String propertyFilePath) throws FileNotFoundException {
PrintWriter pw = new PrintWriter(propertyFilePath);
for (Enumeration e = props.propertyNames(); e.hasMoreElements();) {
String key = (String) e.nextElement();
pw.println(key + "=" + props.getProperty(key));
}
pw.close();
}
如果您使用属性文件的 xml 变体(使用loadFromXML
和storeToXML
),这应该不是问题。
它很简单,只需在那里使用撇号' '例如:
而不是这个(案例1)
File file= new File("f:\\properties\\gog\\esave\\apple");
prop.setProperty("basedir",file.toString());
使用这个(案例2)
File file= new File("f':'\\properties\\gog\\esave\\apple");
prop.setProperty("basedir",file.toString());
输出将是
案例 1: basedir = f\\:\\\\properties\\\\gog\\\\esave\\\\apple
情况 2: basedir = f:\\\\properties\\\\gog\\\\esave\\\\apple
我希望这能帮到您
尝试使用 unicode。
冒号的 unicode 是\:
此外,空格的 unicode 是: \
有关基本拉丁字符的列表,请参阅: https : //en.wikipedia.org/wiki/Basic_Latin_(Unicode_block)
例如:
ProperName\:\\NameContinues=Some property value
将期望带有键的属性:
ProperName:NameContinues
并将具有以下值:
Some property value
对我来说,它通过在特殊字符之前使用\\
来工作,
例如,
Before: VCS\u003aIC\u0020Server\u003a=Migration
After: VCS\:IC\ Server\:=Migration
:
用\\:
和
(空格)与\\
( \\
后跟 <空格>)。
欲了解更多信息: https : //en.wikipedia.org/wiki/.properties
对于像我这样在使用 Spring Boot 配置属性文件时到达这里的人:您需要包含在[..]
:
例如:
my.test\:key=value
还不够,您需要在application.properties
,例如:
my.[test\:key]=value
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.