Java 如何在属性文件中转义冒号(:)?

Java 如何在属性文件中转义冒号(:)?,java,properties,escaping,key-value,colon,Java,Properties,Escaping,Key Value,Colon,我正在使用属性文件来存储应用程序的配置值。 在其中一个实例中,我必须将值存储为 xxx:yyy:zzz。当我这样做时,冒号用反斜杠转义\,结果在属性文件中显示为xxx\:yyy\:zzz 我知道冒号:是PropertiesJava类的标准分隔符。但是,我仍然需要保存不带反斜杠的值\ 有关如何处理此问题的任何建议?如果使用属性文件的xml变量(使用loadFromXML和storeToXML),这应该不是问题。将属性放入属性对象,并使用存储(…)方法保存它。该方法将执行所需的任何转义。报告说: “

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

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


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

如果使用属性文件的xml变量(使用
loadFromXML
storeToXML
),这应该不是问题。

将属性放入
属性
对象,并使用
存储(…)
方法保存它。该方法将执行所需的任何转义。报告说:

“…对于键,所有空格字符都使用前一个\字符写入。对于元素,前导空格字符(而不是嵌入或尾随空格字符)使用前一个\字符写入。键和元素字符#、!、=、和:使用前一个反斜杠写入,以确保正确加载。”

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



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

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

这是有风险的,但如果属性值少于40个字符,则可以使用“列表”方法而不是“存储”:

我们快速查看了JDK代码,并开发了一个自定义的store实现,该实现可用于我们的目的:

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

我遇到了同样的问题。前斜杠
/
也可以通过
属性中的
存储()
方法进行转义

我通过创建自己的
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();
  }
}
很简单,, 只要在那边用撇号就行了 例如:

而不是这个(案例1)

使用此选项(案例2)

输出将是


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

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


我希望这将帮助您尝试使用unicode。

冒号的unicode是
\u003A

此外,空间的unicode是:
\u0020

有关基本拉丁字符的列表,请参见:

例如:

ProperName\u003A\name continues=某些属性值

将需要具有密钥的属性:

ProperName:NameContinues

其价值为:


一些属性值

对我来说,它通过在特殊字符之前使用
\
来工作

e、 g,

\:
(空格)转义为
\
\
后跟)


有关更多信息:

对于像我这样在使用Spring Boot配置属性文件时来到这里的人:您需要在
[…]
中附上:

例如:

这还不够,您需要在
应用程序中使用它。属性
例如:

my.[test\:key]=value

另请参见

恐怕您不能。否则,如何在不混淆“您的”冒号和冒号用于分隔键值的情况下读回属性文件?制作一个StringWriter,将属性文件写入其中,逐行检查缓冲区,查找
“\:”
,并将其替换为单个
“:”
。这并不漂亮,但你要做的也不是很漂亮。@BhavikAmbani“使用正则表达式”是怎么做到的?在保存属性文件时,您究竟从哪里获得了指定正则表达式的机会,以及RE究竟是什么样子的?我也喜欢这种方法,但XML格式对于noobs(“客户等”)来说更难阅读。。。我认为应该有一种方法来转义:,或者使用一些util来选择键值分隔符,就像现在一样:,也被用作分隔符……您可能想要修复复制的打字错误,'flie'而不是'file'oopsy
File file= new File("f':'\\properties\\gog\\esave\\apple");
prop.setProperty("basedir",file.toString());
Before: VCS\u003aIC\u0020Server\u003a=Migration
After: VCS\:IC\ Server\:=Migration
my.test\:key=value
my.[test\:key]=value