22

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

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

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

4

8 回答 8

20

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

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

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


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

于 2012-05-22T09:19:27.757 回答
7

我遇到了同样的问题。正斜杠/也可以通过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();
  }
}
于 2013-05-21T01:34:37.110 回答
3

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

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

http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html#list(java.io.PrintWriter)

我们快速查看了 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();
}
于 2012-07-03T19:43:33.890 回答
1

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

于 2012-05-22T09:18:34.423 回答
0

尝试使用 unicode。

冒号的 unicode 是\u003A

此外,空间的 unicode 是:\u0020

有关基本拉丁字符的列表,请参见:https://en.wikipedia.org/wiki/Basic_Latin_(Unicode_block)

例如:

ProperName\u003A\NameContinues=Some property value

将期望一个带有键的属性:

ProperName:NameContinues

并且将具有以下值:

Some property value

于 2019-12-06T17:49:57.387 回答
0

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

例如,

Before: VCS\u003aIC\u0020Server\u003a=Migration
After: VCS\:IC\ Server\:=Migration

:\: (space) 与\ (\后跟 <Space>) 进行转义。

欲了解更多信息:https ://en.wikipedia.org/wiki/.properties

于 2020-07-03T09:16:05.887 回答
0

它很简单,只需在那里使用撇号 ''例如:

而不是这个(案例1)

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

使用这个(案例2)

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

输出将是


情况1:basedir = f\:\\properties\\gog\\esave\\apple

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

我希望这能帮到您

于 2018-07-02T08:47:29.577 回答
0

对于像我这样在使用 Spring Boot 配置属性文件时为此而来的人:您需要包含在[..]

例如:

my.test\:key=value

还不够,你需要在你application.properties的例子中:

my.[test\:key]=value

另请参阅SpringBoot2 ConfigurationProperties 从 yaml 键中删除冒号

于 2021-01-08T08:56:02.180 回答