Java中BufferedReader不处理Properties续行,真正解析反斜杠续行的是Properties.load()方法;手动解析需跳过尾部空白后判断''并拼接逻辑行,推荐直接使用Properties.load(InputStream)。

BufferedReader 本身不直接解析 Properties 文件的换行续行逻辑,真正处理续行符(反斜杠 后紧跟换行)的是 Properties.load() 方法内部的实现。如果你用 BufferedReader 手动逐行读取并自行解析,就需要模拟这个逻辑。Properties 文件中的续行规则
根据 Java 官方规范,当一行以反斜杠 结尾(即 后紧跟回车或换行),该行与下一行合并为一条逻辑行。注意:
– 反斜杠必须是该物理行的最后一个非空白字符(允许末尾有空格或制表符,但需在 之后);
– 换行符可以是
、
或
;
– 续行后,反斜杠、换行符及中间的空白(如换行后的缩进)均被忽略。
用 BufferedReader 手动处理续行的正确方式
不能简单调用 readLine() 就当作一条配置项。需要循环读取,检测续行标记,并拼接逻辑行:
- 调用
bufferedReader.readLine()获取当前物理行 - 检查该行末尾是否以
结尾(注意:要跳过末尾空白后再判断) - 如果是续行,去掉末尾的
和所有尾部空白,再读取下一行,拼接到当前行末尾 - 重复直到某行不以
(忽略尾空格后)结尾 - 最终得到的拼接字符串才是完整的逻辑行,可传给
Properties.load(new StringReader(line))或自行解析键值对
推荐做法:优先使用 Properties.load()
Properties.load(InputStream) 已完整实现续行、Unicode 转义、注释跳过、键值分隔符识别等全部规范逻辑。只要确保传入的是原始字节流(如 Files.newInputStream(path)),它会自动按标准方式处理反斜杠续行。无需自己用 BufferedReader 解析。
- 错误示范:用
BufferedReader读完再转成String再 load —— 可能破坏原始换行编码,且绕过底层续行处理 - 正确做法:直接传
InputStream给properties.load() - 若必须用 Reader(例如已确定字符集),可用
properties.load(Reader),它同样内置续行处理
特殊情况:自定义解析时如何安全 trim 续行符
如果因特殊需求必须手动解析(比如要记录原始行号、做预处理),关键点在于“尾部反斜杠”的判定:
- 不要用
line.endsWith("\")—— 它无法处理"key=value \ "这类带空格的续行 - 应从末尾向前扫描,跳过所有空白(
Character.isWhitespace()),再判断是否为'\' - 找到
'\'后,截取到该位置前的所有字符作为本段内容,继续读下一行 - 拼接时注意:续行间的换行符和开头空白应丢弃,但行内原有空白保留
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











