为什么在使用JavaAPI生成属性文件时冒号用反斜杠转义?

为什么在使用JavaAPI生成属性文件时冒号用反斜杠转义?,java,properties-file,Java,Properties File,示例代码: public final class Test { public static void main(final String... args) throws IOException { final Properties properties = new Properties(); properties.setProperty("foo", "bar:baz"); // Yeah, this suppo

示例代码:

public final class Test
{
    public static void main(final String... args)
        throws IOException
    {
        final Properties properties = new Properties();

        properties.setProperty("foo", "bar:baz");

        // Yeah, this supposes a Unix-like system
        final Path path = Paths.get("/tmp/x.properties");

        try (
            // Requires Java 8!
            final Writer writer = Files.newBufferedWriter(path);
        ) {
            properties.store(writer, null);
        }
    }
}
现在,当我:

$ cat /tmp/x.properties 
# The date here
foo=bar\:baz
冒号用反斜杠转义。事实上,所有冒号都是

奇怪的是,如果我手动生成一个属性文件,并且不“转义”冒号,那么属性也会被读取


那么,为什么
属性
的编写过程(不管您是使用
编写器
还是
输出流
都是这样)会以这种方式转义冒号呢?

因为属性文件语法允许使用冒号作为键和值之间的分隔符,而不是等号(您可以只使用空格),因此,如果您更改分隔符以避免出现问题,这是一个好主意

例如:

# Add spaces to the key
key\ 2 = value for "key 2"
# colon :
key3: This is key 3
#space
key4 This is key 4

您可以在类的

加载方法中检查其他选项,并提及以下内容:

该键包含行中的所有字符,从第一个非空格字符开始,直到第一个未转义的“=”、“:”或除行终止符以外的空格字符,但不包括这些字符所有这些键终止字符都可以通过使用前面的反斜杠字符转义而包含在键中

例如,以下三行中的每一行都指定了键“真”和相关元素值“美”:

真=美

真理:美

真理:美


因此,冒号可用于确定属性文件中键的结尾。

参考:它也将对
=
#
执行相同的操作()。这意味着如果冒号没有转义,则行为会有所不同。因为文档中指定要发生这种情况。