Java读取带BOM的文本文件需先跳过BOM字节再按指定编码读取;可用Apache Commons IO的BOMInputStream自动处理,或手动用PushbackInputStream检测并跳过UTF-8 BOM(EF BB BF),同时注意编码一致性,BOM仅作提示不可完全依赖。

Java 读取带有 BOM(Byte Order Mark)的文本文件时,如果不做处理,BOM 字节(如 UTF-8 的 EF BB BF)会被当作普通字符读入,导致开头出现乱码(如 )或解析失败。核心思路是:**跳过 BOM 字节,再按指定编码读取后续内容**。
识别并跳过 UTF-8 BOM
UTF-8 的 BOM 是三个字节 0xEF 0xBB 0xBF。可在读取前检测并跳过:
- 用
InputStream先读取前 3 字节,判断是否为 BOM - 如果是,丢弃这 3 字节,后续流以 UTF-8 编码读取
- 如果不是,重置流位置(需使用
PushbackInputStream或缓存字节)
使用 Apache Commons IO(推荐)
org.apache.commons.io.input.BOMInputStream 可自动检测并跳过常见 BOM(UTF-8/UTF-16BE/UTF-16LE),简化处理:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
BOMInputStream bomIn = new BOMInputStream(new FileInputStream("file.txt"));
// 自动跳过 BOM,后续读取即为干净内容
InputStreamReader reader = new InputStreamReader(bomIn, StandardCharsets.UTF_8);
BufferedReader br = new BufferedReader(reader);
String line = br.readLine(); // line 不含 BOM
手动处理(无第三方依赖)
若不能引入外部库,可封装一个安全的 Reader 工厂方法:
立即学习“Java免费学习笔记(深入)”;
public static Reader getReaderWithoutBOM(File file) throws IOException {
InputStream is = new FileInputStream(file);
PushbackInputStream pbis = new PushbackInputStream(is, 3);
byte[] bom = new byte[3];
int read = pbis.read(bom, 0, 3);
if (read == 3 && bom[0] == (byte)0xEF && bom[1] == (byte)0xBB && bom[2] == (byte)0xBF) {
// 跳过 UTF-8 BOM
} else {
pbis.unread(bom, 0, read); // 退回已读字节
}
return new InputStreamReader(pbis, StandardCharsets.UTF_8);
}
注意编码一致性
BOM 仅用于提示编码,不代表文件一定是该编码。例如某些编辑器保存为 GBK 却误加 UTF-8 BOM,会导致解码异常:
- 优先依据业务约定或文件来源确定真实编码
- BOM 检测仅作辅助,不可完全依赖
- 若不确定编码,可用
juniversalchardet等库探测

















