【问题标题】:Can the key in a Java property include a blank character?Java 属性中的键可以包含空白字符吗?
【发布时间】:2011-01-07 15:55:33
【问题描述】:

我们正在从数据库中获取属性(我们无法影响),并希望通过键/值映射来访问它们。 我们面临的问题是其中一个属性键包含空白字符。

foo bar = barefoot

这 - 正确 - 解释如下

key: foo
value: bar = barefoot

有没有办法在键中包含空格,这样它就不会被解释为分隔符?我想这种行为就像预期的那样,但我想我可以在这里尝试一下。

【问题讨论】:

标签: java properties key-value


【解决方案1】:
keyValuePair = keyValuePair.substring(0,indexOf("=")).replaceAll("\\s+") + 
               keyValuePair.substring(indexOf("="));  

【讨论】:

    【解决方案2】:

    我假设“属性”是指 Java 属性文件(由 java.util.Properties 写入/读取)。

    那么,当你自己写的时候,

    foo bar = barefoot
    

    确实必须被解释为

    key: foo
    value: bar = barefoot
    

    没有办法使用内置的Properties 类来配置它。您必须操纵您的输入(转义空格,将其更改为 _ 并返回...),或者编写您自己的解析器。编写自己的解析器可能会更好,因为很明显,您的输入并不是真正的 Java 属性文件:-)。

    【讨论】:

    • +1 “并不是真正的 Java 属性文件”。人们看到“key=value”并认为它是一个属性文件。他们忘记了属性文件有很多规则,如果您的输入没有遵循所有,那么它就不是属性文件。另一个例子:Java 属性默认使用 Latin1 (a.k.a ISO-8859-1) 编码并支持 Unicode 转义。
    • 编写自己的解析器也需要处理 .properties 中的 cmets 块。
    • @OmSao:是的。这很好地说明了确保您准确了解文件可以包含或不包含的内容很重要的问题。
    【解决方案3】:

    您可以使用 Java Unicode 转义属性文件中的所有内容:

    • \u003d=
    • \u0020 用于空格

    例如:

    foo bar = barefoot
    

    必须是:

    foo\u0020bar\u0020=\u0020barefoot
    

    会是这样:

    key: "foo bar "
    value: " barefoot"
    

    【讨论】:

    • 这是“正确”的答案。所有其他选项最终都将采用非标准解决方案。请使用这个答案:)
    • 请注意,这似乎不适用于 Grails 配置文件(不是 .groovy 而是 .properties;在 2.5.1 上测试)。
    • 很好的解决方案。但是请注意,OP 写道它们“不能影响”它们获得的属性,因此转义可能不切实际。当然,也许可以有一些预处理步骤来做到这一点......
    • 同意这是正确的答案,假设您可以修改属性文件。
    • 如果 OP 可以更改属性文件,那么他可以简单地将其设置为 foo.bar 而不是 foo bar 避免使用 Unicode 字符相当混乱。但是,OP 声明无法更改属性,因此这并不能解决给定的问题。
    【解决方案4】:

    看起来分隔符应该是=,而不是空格。 因此 - keyValuePair.split("=") 应该这样做。

    如果您是从 java .properties 文件加载它,那么您可以扩展 java.util.Properties 并覆盖此方法

    public synchronized void load(InputStream inStream) throws IOException
    

    以便它正确解析属性。

    【讨论】:

    • 嗯,Properties 中的重写方法似乎充其量是可疑的。 Properties 类中可能有许多硬编码假设,因此它是未来错误的来源。如果它不是一个正确的属性文件,我宁愿不使用属性来读取它。
    • 至少应该尝试一下,因为这样会节省很多时间。如果它不起作用 - 当然创建一个单独的属性解析
    • 如何设置keyValuePair.split("=")
    • 我没看懂问题
    • From the doc: "密钥包含行中从第一个非空白字符开始的所有字符,最多但不包括,第一个未转义的 '='、':' 或空格字符,而不是行终止符。"所以空格被记录为分隔符,所以我不明白你的说法“分隔符应该是=,而不是空格。”。规范说空格是一个有效的分隔符,那么为什么“应该”它是=
    【解决方案5】:

    也许你可以避开空格:foo\ bar = barefoot

    编辑:糟糕,我没有看到您不能更改属性。

    【讨论】:

    • 转义空格不适用于大多数默认修剪行尾空格的编辑器 - 想想需要尾随空格的大型机参数。正确的是 Veaceslav 的解决方案。
    猜你喜欢
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 2011-07-07
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多