2012-05-22 87 views
15

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

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

有关如何处理此问题的任何建议?

+1

我怕你不能。否则,如何读取属性文件而不会混淆“你的”冒号,冒号用于分隔关键值? – ewernli

+0

制作一个StringWriter,写入你的属性文件,逐行浏览缓冲区,寻找'“\:”',并用一个'“:”'替换它。这并不好看,但是你想要做的也不是很漂亮。 – dasblinkenlight

+1

@BhavikAmbani'使用正则表达式'表示* how?*在保存属性文件的时候,您究竟能够指定一个正则表达式?RE看起来像什么? – EJP

回答

16

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

” ......为重点,所有的空格字符都写前面都有一个\字符元素,前导空格字符,但不嵌入或尾随空格字符,用书面前面的\字符,键和元素字符#,!,=和:用前面的反斜杠写入,以确保它们正确加载。

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


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

1

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

+0

我也喜欢这种方法,但对于noobs(“客户等”)来说,XML格式有点难以阅读......我认为应该有办法如何逃避,或者使用某些utils来选择键值分隔符,如现在:也被当作分隔符... –

2

几天前我们遇到了这个问题。我们正在使用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(); 
} 
5

我遇到了同样的问题。正向斜杠/也被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(); 
    } 
}