我正在使用属性文件来存储我的应用程序的配置值。 在其中一个实例中,我必须将值存储为 xxx:yyy:zzz
。当我这样做时,冒号将以反斜杠\
转义,导致属性文件中的值显示为xxx\:yyy\:zzz
。如何在属性文件中冒号冒号(:)?
我知道冒号:
是Properties
Java类的标准分隔符。不过,我仍然需要保存该值,而不用反斜杠\
。
有关如何处理此问题的任何建议?
我正在使用属性文件来存储我的应用程序的配置值。 在其中一个实例中,我必须将值存储为 xxx:yyy:zzz
。当我这样做时,冒号将以反斜杠\
转义,导致属性文件中的值显示为xxx\:yyy\:zzz
。如何在属性文件中冒号冒号(:)?
我知道冒号:
是Properties
Java类的标准分隔符。不过,我仍然需要保存该值,而不用反斜杠\
。
有关如何处理此问题的任何建议?
将属性放入Properties
对象并使用store(...)
方法保存。该方法将执行任何所需的转义。该Java documentation说:
” ......为重点,所有的空格字符都写前面都有一个\字符元素,前导空格字符,但不嵌入或尾随空格字符,用书面前面的\字符,键和元素字符#,!,=和:用前面的反斜杠写入,以确保它们正确加载。
如果您是手动创建/写入文件,则只需手动转义字符。
相反,如果您希望文件包含未转义的冒号字符,那么您运气不好。这样的文件格式不正确,可能无法使用Properties.load(...)
方法正确加载。如果沿着这条路线走,你需要实现自己的自定义加载和/或存储方法。
如果您使用属性文件的xml变体(使用loadFromXML
和storeToXML
),这应该不成问题。
我也喜欢这种方法,但对于noobs(“客户等”)来说,XML格式有点难以阅读......我认为应该有办法如何逃避,或者使用某些utils来选择键值分隔符,如现在:也被当作分隔符... –
几天前我们遇到了这个问题。我们正在使用URL作为值操作现有的属性文件。
这是有风险的,但如果你的财产值少于40个字符,那么你可以用它代替“存储”的“名单”的方法:
http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html#list(java.io.PrintWriter)
我们有一个快速浏览一下JDK代码黑客出了一个自定义实现的商店,适用于我们的目的:
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();
}
我遇到了同样的问题。正向斜杠/
也被store()
方法在Properties
中转义。
我创造我自己的CustomProperties
类(扩展java.util.Properties
)和customStore0()
方法注释掉调用saveConvert()
解决了这个问题。
这里是我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();
}
}
我怕你不能。否则,如何读取属性文件而不会混淆“你的”冒号,冒号用于分隔关键值? – ewernli
制作一个StringWriter,写入你的属性文件,逐行浏览缓冲区,寻找'“\:”',并用一个'“:”'替换它。这并不好看,但是你想要做的也不是很漂亮。 – dasblinkenlight
@BhavikAmbani'使用正则表达式'表示* how?*在保存属性文件的时候,您究竟能够指定一个正则表达式?RE看起来像什么? – EJP