根据 java.util.Properties 的 load(Reader reader)
方法的文档中所述:Property 是按行处理的。有两种行,自然行和逻辑行。
- 自然行定义为以行终止符(
\n
或\r
或\r\n
)结尾或以流结束而终止的行。自然行可以是空行、注释行,也可以包含全部或 key-value 对的部分内容。 - 逻辑行包含一个 key-value 对的所有内容,逻辑行可以通过使用反斜杠字符
\
转义行终止序列,从而使逻辑行跨越多个自然行。
注意:注释行不能以这种方式跨越多行,作为注释的每个自然行都必须有自己的注释标识符,如下所述。行从输入读取,一直读到流的末尾。
仅包含空白字符的自然行被视为空白,将被忽略。注释行具有 ASCII 的 #
或 !
字符来作为其第一个非空白字符;注释行也被忽略,不编码 key-value 信息。除行终止符外,该格式还将空格(\u0020
)、水平制表符(\t
,\u0009
)和换页符(form feed,\f
,\u000C
)视为空白符。
如果一条逻辑行跨越多条自然行,则转义行终止符序列的反斜杠、行终止符序列和下一行开始处的任何空白对 key 和 value 没有影响。关于 key 和 value 的解析(加载时)的其余讨论将假定构成 key 和 value 的所有字符在删除行连续字符后出现在单个自然行上。请注意,仅检查行终止符序列前面的字符以确定是否转义了行终止符还是不够的,必须有奇数个连续反斜杠才能转义行终止符。由于输入是从左到右处理的,因此在转义处理之后,行终止符(或其他位置)之前的第 2n 个(非零偶数编码)的连续反斜杠会编码第 n 个反斜杠。
其中,key 包含每行中从第一个非空白字符开始,到第一个未转义的 =
、:
(不含)字符,或到除行终止符以外的第一个空白字符之间的所有字符(如果没有未转义的 =
、:
字符),但不包括这些字符(第一个未转义的 =
、:
(不含)字符,或除行终止符以外的第一个空白字符)。所有这些 key 终止字符(=
或 :
)都可以通过在前面使用反斜杠字符转义而包含在 key 中;例如 \:\=
将是两个字符的 key(:=
)。可以使用转义序列 \r
和 \n
来包含行终止符。key 后面的任何空白符都将会跳过。如果 key 后面的第一个非空白符是 =
或 :
,则忽略它,并跳过它之后的任何空白字符。行上剩余的所有其他字符将成为对应 value 的一部分,如果没有剩余字符,则 value 为空字符串。一旦识别出构成 key 和 value 的原始字符序列,如上所述执行转义处理。
例如,以下三行中的每一行都指定了 key 为 true
和 value 为 Beauty
的 Property:
Truth = Beauty # key 包含从第一个非空白字符开始,到第一个未转义的 = 字符之间的所有字符
Truth:Beauty # key 包含从第一个非空白字符开始,到第一个未转义的 : 字符之间的所有字符
Truth :Beauty
作为另一个示例,以下三行指定了一个 property:
fruits apple, banana, pear, \
cantaloupe, watermelon, \
kiwi, mango # key 包含从第一个非空白字符开始,到除行终止符以外的第一个空白字符之间的所有字符(如果没有=、:)
其中,key 是 fruits
,对应的 value 是:apple, banana, pear, cantaloupe, watermelon, kiwi, mango
。
请注意,每个 \
前面都会出现一个空格,这样在最终结果中,每个逗号后面都会出现一个空格;\、行终止符、续行上的前导空格将被丢弃,不会被一个或多个其他字符替换。
作为第三个示例,
cheeses
上面的行指定 key 为 cheeses
,对应的 value 为空字符串。
key 和 value 中的字符可以用转义序列表示,转义序列类似于用于字符和字符串文本的转义序列(参见 Java 语言规范 §3.3 和 §3.10.6)。与用于字符和字符串的字符转义序列和 Unicode 转义的区别是:
-
在这里,不会识别八进制的转义字符。
-
在这里,字符序列
\b
不表示退格字符。 -
该方法不会将无效转义字符之前的反斜杠字符 \ 视为错误;反斜杠会自动删除。例如,在 Java 字符串中,序列
\z
将导致编译时错误。相反,该方法会自动删除反斜杠。因此,将\b
这两个字符序列视为等同于单个字符b
。 -
单引号和双引号不需要转义;但是,根据上面的规则,前面带有反斜杠的单引号和双引号字符仍然分别产生单引号和双引号字符。
-
Uniocde 转义序列中只允许一个
u
字符。
该方法返回后,指定的流仍会保持打开状态。
如果 key 中包含 =
或 :
,则需要将这些字符转移,由于该方法只识别第一个未转义的 =
、:
(不含)字符,所以,value 中 =
或 :
不需要转移。
网友评论