微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用BOMInputStream跳过BOM表并检索不带BOM的byte []

如何解决使用BOMInputStream跳过BOM表并检索不带BOM的byte []

我有一个带BOM(UTF-8编码)的xml文件。该文件byte[]的形式出现。我需要跳过BOM表,然后再将这些字节转换为字符串。

这是我的代码现在的样子:

BOMInputStream bomInputStream = new BOMInputStream(new ByteArrayInputStream(requestDTO.getFile())); // getFile() returns byte[]

bomInputStream.skip(bomInputStream.hasBOM() ? bomInputStream.getBOM().length() : 0);

validationService.validate(new String(/*BYTE[] WITHOUT BOM*/)); // throws NullPointerException

我正在使用BOMInputStream。我有几个问题。第一个bomInputStream.hasBOM()返回false。第二个,我不确定以后如何从byte[]检索bomInputStream,因为bomInputStream.getBOM().getBytes()抛出NullPointerException。感谢您的帮助!

BOMInputStream文档链接https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/input/BOMInputStream.html

解决方法

没有布尔值包含参数的构造函数将BOM排除在外,因此hasBOM()返回false,并且不会包含BOM。并且该字符串将不包含BOM。 然后getBOM()返回null!

byte[] xml = requestDTO.getFile();
int bomLength = 0;
Charset charset = StandardCharsets.UTF_8;
try (BOMInputStream bommedInputStream = new BOMInputStream(new ByteArrayInputStream(xml),true)) {
    if (bommedInputStream.hasBOM()) {
        bomLength = bommedInputStream.getBOM().length();
        charset = Charset.forName(bommedInputStream.getBOMCharsetName());
    } else {
        // Handle <?xml ... encoding="..." ... ?>.
        String t = new String(xml,StandardCharsets.ISO_8859_1));
        String enc = t.replace("(?sm).*<\\?xml.*\\bencoding=\"([^\"]+)\".*\\?>.*$","$1");
        ... or such to fill charset ...
    }
}
String s = new String(xml,charset).replaceFirst("^\uFEFF",""); // Remove BOM.
validationService.validate(s);

可以使用bomLength删除BOM。 BOMInputStream可以为我们提供许多UTF变体的字符集。

不带编码/字符集的String构造函数(如您所用)将使用默认平台编码。因为BOM是Unicode代码指针U + FEFF,所以只需传递"\uFEFF"

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。