按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。
根据行来处理属性。有两种行,即自然行 和逻辑行。自然行定义为通过行结束符字符集(\n 或 \r 或 \r\n),或者通过流的结尾来终止的字符行。一个自然行可能是一个空行、注释行,或者保存了全部或部分键-元素对。逻辑行保存了所有键-元素对的数据,可能分散在多个相邻的自然行中,用反斜杠字符 \ 转义行结束符序列。注意,不能以此方式扩展注释行;每个内容为注释的自然行必须有其自己的注释指示符,正如下面所描述的。到达流结尾前,将一直从输入中读取各行。
仅包含空白字符的自然行认为是空行并被忽略。注释行以 ASCII 字符 '#' 或 '!' 作为其首个非空白字符;注释行也被忽略并且不将其编码为键-元素信息。除了行结束符,此格式还将空格字符(' ','\u0020')、制表符('\t','\u0009')和换页符('\f','\u000C')作为空白。
如果一个逻辑行分散在多个自然行中,则转义行结束符序列的反斜杠、行结束符序列和后续行开始处的任何空白,对键或元素的值都没有影响。后面对键和元素解析的讨论(加载时)将假定移除行继续符后,构成键和元素的所有字符都出现在单个自然行中。注意,仅检查行结束符前面的字符,以便决定行结束符是否已转义是不 够的;对于要转义的行结束符,必须有奇数个相邻的反斜杠。由于是从左到右来处理输入内容的,所以行结束符前(或其他位置)非零、偶数 2n 个相邻的反斜杠在转义处理后会被编码成 n 个反斜杠。
键包含行中下列区间内的所有字符:从首个非空白字符开始,直到(但不包括)首个非转义的 '='、 ':' 或非行结束符的空白字符。所有这些键终止字符都可能包含在键中,方法是在其前面用反斜杠字符进行转义,例如:
\:\=
将是两字符的键 ":="。可以使用 \r 和 \n 转义序列包括行结束符字符。跳过键后面的所有空白字符;如果键后的首个非空白字符是 '=' 或 ':',则忽略该字符并且跳过其后的所有空白字符。行中所有剩余的字符都成为关联元素字符串的一部分;如果没有剩余的字符,则该元素为空字符串 ""。一旦标识了组成键和元素的原始字符序列,则如上所述执行转义处理。
作为一个示例,以下三行都指定了键 "Truth" 和关联元素值 "Beauty":
Truth = Beauty
Truth:Beauty
Truth :Beauty 另一个示例,以下三行都指定了单个属性:
fruits apple, banana, pear, \
cantaloupe, watermelon, \
kiwi, mango 键是
"fruits",关联元素是:
"apple, banana, pear, cantaloupe, watermelon, kiwi, mango" 注意,在每个
\ 的前面出现了一个空格,这样最后的结果中每个逗号的后面将出现一个空格;会将
\、行结束符和后续行中的前导空白字符简单地丢弃,并且
不会 用一个或多个其他字符替换它们。
第三个示例,此行:
cheeses 指定键是
"cheeses" 并且关联元素是空字符串
""。
以键和元素的形式表示的字符可以使用与字符和字符串字面值所用的类似转义序列表示。(请参阅 Java Language Specification 的 §3.3 节 和 §3.10.6 节)。 字符和字符串所用的字符转义序列和 Unicode 转义的差别有:
不识别八进制转义。
字符序列 \b 不表示退格字符。
该方法并不将无效转义字符前的反斜杠字符 \ 视为错误;只是将反斜杠丢弃。例如,在 Java 字符串中,序列 "\z" 将导致编译时错误。相反,此方法会丢弃该反斜杠。因此,此方法将两字符序列 "\b" 与单字符 'b' 视为等同。
转义对于单引号和双引号而言不是必需的;但是根据上面的规则,前面有反斜杠的单引号和双引号字符仍旧分别生成单引号和双引号字符。
Uniocde 转义序列中只允许单个 'u' 字符。
此方法返回后,指定的流仍保持打开状态。