BufferedReader 仅用于轻量探查文件格式,不解析 YAML/JSON;通过 mark/reset 读取前 1024 字节,结合 BOM 处理与特征模式(如 {、[、---、: 后空格)判断格式类型,再交由专业库解析。

BufferedReader 本身不解析 YAML 或 JSON,它只负责按行或按字符读取原始文本。所谓“预读取探查”,实际是指在不触发完整解析(如不调用 Jackson/YAML 库的 parse())的前提下,用 BufferedReader 快速扫描文件开头,判断格式类型、编码、是否为空、是否有 BOM、是否存在明显语法特征(如 {、[、---)等。
用 BufferedReader 探查文件基础特征
先打开流,读少量内容(例如前 1024 字节),避免加载整个大文件:
- 调用
reader.mark(1024)设置标记位置,再用reader.read(buffer, 0, 1024)读一段; - 读完后立即
reader.reset(),后续交给 Jackson / SnakeYAML 正常解析; - 注意:必须确保底层 InputStream 支持 mark/reset(如 FileInputStream 可以,但网络流可能不行);
- 把读到的字节数组转为字符串时,显式指定编码(如 UTF-8),并跳过 BOM(如遇到
uFEFF就截掉)。
识别 YAML 还是 JSON 的关键线索
仅靠前几百字符就能做高置信度判断:
- JSON:开头常见
{或[,且不含---、:后紧跟空格+换行这种 YAML 风格; - YAML:开头可能是
---(显式文档开始)、#(注释)、键名后跟:+ 空格/换行,或缩进结构; - 混合情况(如 YAML 文件里嵌 JSON 字符串)不用管,探查目标只是选对解析器,不是校验内容;
- 可写一个简单方法:扫描前 5 行,统计
:后有空格/换行的出现频次,再结合{/[是否孤立出现。
规避常见陷阱
大文件场景下容易踩坑:
立即学习“Java免费学习笔记(深入)”;
- 别用
readLine()做探查——某些 YAML 多行字符串(|或>)会让单行读取断裂,丢失上下文; - 别依赖文件扩展名(
.yaml或.json)——配置可能被重命名或无后缀; - UTF-8 with BOM 文件,
InputStreamReader默认不跳过 BOM,会导致首字符异常,需手动处理; - 如果探查后决定用 Jackson 解析 JSON,记得用
JsonFactory的createParser(reader)复用已 reset 的 reader,避免重复打开流。
轻量级探查示例代码片段
不依赖第三方,仅用 JDK:
String probe = readProbeString(reader, 1024); // 自定义方法,含 BOM 清理
if (probe.trim().startsWith("{") || probe.trim().startsWith("[")) {
return ConfigFormat.JSON;
} else if (probe.contains("---") ||
Pattern.compile(":\s*$", Pattern.MULTILINE).matcher(probe).find()) {
return ConfigFormat.YAML;
}
// fallback 根据后续字符启发式判断
探查只是决策前置步骤,真正解析仍交给专业库。BufferedReader 在这里角色明确:快、轻、可控,不越界做语法分析。


















