你如何逃避属性文件中的冒号(:)?

我正在使用属性文件来存储我的应用程序的配置值。 在其中一个实例中,我必须将值存储为xxx:yyy:zzz 。 当我这样做时,冒号用反斜杠\转义,导致属性文件中的值显示为xxx\:yyy\:zzz

我知道冒号:Properties Java类的标准分隔符。 但是我仍然需要保存值而不使用反斜杠\

有关如何处理这个的任何建议?

将属性放入Properties对象并使用store(...)方法保存它。 该方法将执行所需的任何转义。 Java文档说:

“…对于密钥,所有空格字符都使用前面的\字符写入。对于元素,前导空格字符,但不是嵌入或尾随空格字符,使用前面的\字符写入。键和元素字符#, !,=和:用前面的反斜杠写成,以确保它们正确加载。“

如果要手动创建/写入文件,则只需手动转义字符。


相反,如果您希望文件包含未转义的冒号字符,那么您就不走运了。 这样的文件格式不正确,可能无法使用Properties.load(...)方法正确加载。 如果你沿着这条路走下去,你需要实现自己的自定义加载和/或存储方法。

我遇到了同样的问题。 正斜杠/也可以通过Propertiesstore()方法进行转义。

我通过创建自己的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(); } } 

几天前我们遇到了这个问题。 我们使用URL作为值来操作现有的属性文件。

这有风险,但如果您的属性值小于40个字符,那么您可以使用“list”方法而不是“store”:

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(); } 

如果您使用属性文件的xml变体(使用loadFromXMLstoreToXML ),这应该不是问题。

它简单,只需在那边使用Apostrophe

而不是这个(案例1)

 File file= new File("f:\\properties\\gog\\esave\\apple"); prop.setProperty("basedir",flie.toString()); 

使用此(案例2)

 File file= new File("f':'\\properties\\gog\\esave\\apple"); prop.setProperty("basedir",flie.toString()); 

输出将是


案例1:basedir = f:\ properties \ gog \ esave \ apple

案例2:basedir = f:\ properties \ gog \ esave \ apple

我希望这能帮到您