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

ind*_*iws 18 java escaping properties key-value colon

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

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

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

Ste*_*n C 17

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

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

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


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


Pat*_*nan 5

我遇到了同样的问题.正斜杠/也会被store()方法转义Properties.

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