Java读取XML文件字节数组输出差异原因及XML首三字符是什么?
问题解答
问题1:XML文件内部的前三个字符是什么?
你看到的 : -17 ᄏ : -69 : -65这三个字节,其实是UTF-8的字节顺序标记(BOM),对应的十六进制是EF BB BF。这三个字节并不是XML内容本身的一部分,是部分编辑器保存UTF-8文件时自动添加的标识,用来告诉阅读器文件采用UTF-8编码。而真正XML内容的第一个字符是后面的<(ASCII码60)。
问题2:为何使用Java读取文件字节数组时会出现输出差异?
这个差异的核心原因就是原文件带有UTF-8 BOM,复制后的文件没有了:
- 原文件
exampleData.xml保存时带有UTF-8 BOM,你的代码是直接读取文件的字节数组,所以会把开头的三个BOM字节(-17、-69、-65)也读出来并转换成字符,就出现了那些奇怪的符号输出。 - 当你把内容复制到
exampleDataCopy.xml时,大概率是你的文本编辑器或复制操作自动去掉了UTF-8 BOM(很多编辑器默认保存UTF-8文件时不会添加BOM,复制内容时也会忽略BOM),所以读取这个复制后的文件时,字节数组开头直接就是XML的内容<,自然看不到那三个奇怪的字节输出了。
额外提一句:Java标准字符流(比如Reader)不会自动识别UTF-8 BOM,用字节流读取时就会把BOM当作普通字节处理。如果想避免这种情况,可以在读取时先检查开头是否是BOM字节,然后跳过它们。
内容的提问来源于stack exchange,提问作者datascient
相关产品推荐
相关产品推荐

