我正在尝试使用 Java 读取 CSV 文件。有些文件可能在开头有字节顺序标记,但不是全部。如果存在,字节顺序将与第一行的其余部分一起读取,从而导致字符串比较出现问题。
有没有一种简单的方法可以在存在字节顺序标记时跳过它?
原文由 Tom 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在尝试使用 Java 读取 CSV 文件。有些文件可能在开头有字节顺序标记,但不是全部。如果存在,字节顺序将与第一行的其余部分一起读取,从而导致字符串比较出现问题。
有没有一种简单的方法可以在存在字节顺序标记时跳过它?
原文由 Tom 发布,翻译遵循 CC BY-SA 4.0 许可协议
Apache Commons IO 库有一个 InputStream
可以检测和丢弃 BOM: BOMInputStream
(javadoc) :
BOMInputStream bomIn = new BOMInputStream(in);
int firstNonBOMByte = bomIn.read(); // Skips BOM
if (bomIn.hasBOM()) {
// has a UTF-8 BOM
}
如果您还需要检测不同的编码,它还可以区分各种不同的字节顺序标记,例如 UTF-8 与 UTF-16 big + little endian - 上面的文档链接中有详细信息。然后,您可以使用检测到的 ByteOrderMark
选择一个 Charset
来解码流。 (如果您需要所有这些功能,可能有更简化的方法来执行此操作——也许是 BalusC 的答案中的 UnicodeReader?)。请注意,一般来说,没有一种很好的方法来检测某些字节的编码,但如果流以 BOM 开头,显然这会有所帮助。
编辑:如果您需要检测 UTF-16、UTF-32 等格式的 BOM,则构造函数应为:
new BOMInputStream(is, ByteOrderMark.UTF_8, ByteOrderMark.UTF_16BE,
ByteOrderMark.UTF_16LE, ByteOrderMark.UTF_32BE, ByteOrderMark.UTF_32LE)
赞成@martin-charlesworth 的评论 :)
原文由 rescdsk 发布,翻译遵循 CC BY-SA 3.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
1 回答2.1k 阅读✓ 已解决
编辑:我在 GitHub 上做了一个正确的发布: https ://github.com/gpakosz/UnicodeBOMInputStream
这是我刚才编写的一个类,我只是在粘贴前编辑了包名。没什么特别的,它与 SUN 的错误数据库中发布的解决方案非常相似。将它合并到您的代码中就可以了。
你正在这样使用它: