Java如何BOM标记
Java处理BOM标记的方法
BOM(Byte Order Mark)是Unicode文件中用于标识编码方式的标记字符,常见于UTF-8、UTF-16等编码的文件开头。Java中处理BOM标记需要注意以下要点:
检测BOM标记
使用InputStream读取文件前几个字节,判断是否存在BOM标记。UTF-8的BOM为0xEF, 0xBB, 0xBF,UTF-16的BOM为0xFEFF或其反向。
InputStream inputStream = new FileInputStream("file.txt");
byte[] bom = new byte[3];
inputStream.read(bom);
if (bom[0] == (byte) 0xEF && bom[1] == (byte) 0xBB && bom[2] == (byte) 0xBF) {
System.out.println("UTF-8 BOM detected");
}
跳过BOM标记

检测到BOM后,可以通过跳过字节的方式忽略它:
InputStream inputStream = new FileInputStream("file.txt");
byte[] bom = new byte[3];
inputStream.read(bom);
if (!(bom[0] == (byte) 0xEF && bom[1] == (byte) 0xBB && bom[2] == (byte) 0xBF)) {
inputStream.reset(); // 如果不是BOM,重置流指针
}
使用第三方库处理
Apache Commons IO库提供BOMInputStream类专门处理BOM:

BOMInputStream bomIn = new BOMInputStream(new FileInputStream("file.txt"));
if (bomIn.hasBOM()) {
// 处理带BOM的文件
}
Reader reader = new InputStreamReader(bomIn, "UTF-8");
写入BOM标记
需要写入BOM时,直接在文件开头写入对应字节:
OutputStream out = new FileOutputStream("file.txt");
out.write(0xEF);
out.write(0xBB);
out.write(0xBF);
out.write("内容".getBytes("UTF-8"));
注意事项
- 不是所有UTF-8文件都有BOM标记,多数情况下不建议添加
- 处理文本文件时,明确指定编码方式(如UTF-8、UTF-16)比依赖BOM更可靠
- 某些Java API(如
Files.readAllLines)会自动处理BOM标记





