如何使用BOM InputStream排除BOM

时间:2014-11-25 20:38:17

标签: java android xml xml-parsing byte-order-mark

我试图弄清楚如何在使用Apache给出的示例时简单地排除BOM。 我正在从内部存储中读取文件并将其首先转换为String。然后我将其转换为ByteArray,以便获得InputStream。然后我用BOMInputStream检查物料清单,因为我有错误的#34;意外的令牌"。 现在我不知道如果我拥有它就如何排除。

CODE:

StringBuffer fileContent = new StringBuffer("");
String temp = "";
int ch;
try{
    FileInputStream fis = ctx.openFileInput("dataxml");
try {
    while( (ch = fis.read()) != -1)
        fileContent.append((char)ch);
        temp = temp + Character.toString((char)ch);
} catch (IOException e) {
    e.printStackTrace();
}
} catch (FileNotFoundException e) {
    e.printStackTrace();
}


InputStream ins = new ByteArrayInputStream(temp.getBytes(StandardCharsets.UTF_8));
BOMInputStream bomIn = new BOMInputStream(ins);
if (bomIn.hasBOM()) {
    // has a UTF-8 BOM

}

xpp.setInput(ins,"UTF-8");
parseXMLAndStoreIt(xpp);
ins.close();

文件名为" dataxml",我将其存储在openFileOutput的不同班级中。

3 个答案:

答案 0 :(得分:1)

我之前从未使用过BOMInputStream,但要从流中排除字节顺序标记,您只需要从比BOM末尾位置大一个偏移处开始读取。 BOMInputStream是否具有指示BOM位置的属性? 另外,您可以在这里查看:http://www.rgagnon.com/javadetails/java-handle-utf8-file-with-bom.html

答案 1 :(得分:1)

您可以使用BOMInputStream删除BOM,如下所示:

BOMInputStream bis = new BOMInputStream(inputStream);
        if (bis.hasBOM()) {
           bis.skip(bis.getBOM().length());
        }

如果它不能工作,你可以调整跳过参数。在我的情况下,我得到了工作解决方案:

  bis.skip(bis.getBOM().length()-3);

答案 2 :(得分:0)

您正在构建一个String Input字符,从InputStream中忽略BOM和编码。你从蒸汽转换一个字节到一个字符读取字符的方式很糟糕,非常糟糕。请使用Reader的任何实现(指定编码)从字节序列中读取字符。

稍后您将String转换回字节(并且您需要注意指定编码。如果您比较此时获得的字节序列,它可能与您从商店中获取的字节序列非常不同。