如何逃离冒号 (:)在属性文件中?

2022-09-01 23:15:03

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

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

关于如何处理这个问题的任何建议?


答案 1

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

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

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


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


答案 2

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

我通过创建自己的类(扩展 )并注释掉对方法中的调用来解决此问题。CustomPropertiesjava.util.PropertiessaveConvert()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();
  }
}