Java 如何使用BOM InputStream排除BOM

Java 如何使用BOM InputStream排除BOM,java,android,xml,xml-parsing,byte-order-mark,Java,Android,Xml,Xml Parsing,Byte Order Mark,我试图找出在使用Apache给出的示例时如何简单地排除BOM。 我正在从内部存储器读取一个文件,并首先将其转换为字符串。然后我将它转换成ByteArray,这样我就得到了一个InputStream。然后我用BOMInputStream检查BOM,因为我有“意外令牌”的错误现在,如果我有BOM,我不知道如何排除它。 代码: StringBuffer fileContent = new StringBuffer(""); String temp = ""; int ch; try{ File

我试图找出在使用Apache给出的示例时如何简单地排除BOM。 我正在从内部存储器读取一个文件,并首先将其转换为
字符串
。然后我将它转换成
ByteArray
,这样我就得到了一个
InputStream
。然后我用
BOMInputStream
检查BOM,因为我有“意外令牌”的错误现在,如果我有BOM,我不知道如何排除它。

代码:

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

将其存储在不同的类中,我以前从未使用过BOMInputStream,但要从流中排除字节顺序标记,您只需从一个大于BOM末端位置的偏移量开始读取。BOMInputStream是否具有指示BOM表位置的属性?
另外,您可以在这里查看:

我以前从未使用过BOMInputStream,但要从流中排除字节顺序标记,您只需从大于BOM表末尾位置1的偏移量开始读取。BOMInputStream是否具有指示BOM表位置的属性?
另外,您可以在这里查看:

我以前从未使用过BOMInputStream,但要从流中排除字节顺序标记,您只需从大于BOM表末尾位置1的偏移量开始读取。BOMInputStream是否具有指示BOM表位置的属性?
另外,您可以在这里查看:

我以前从未使用过BOMInputStream,但要从流中排除字节顺序标记,您只需从大于BOM表末尾位置1的偏移量开始读取。BOMInputStream是否具有指示BOM表位置的属性?
另外,您可以在这里查看:

您正在构建一个字符串,从输入流中读取字符,而不考虑BOM和编码。从steam中读取字符的方式将一个字节转换为一个字符是非常糟糕的。请使用Reader的任何实现(指定编码)从字节序列中读取字符


稍后将字符串转换回字节(在这里,您需要注意指定编码。如果您比较此时获得的字节序列,它可能与您从存储中获取的序列非常不同。

您正在构建一个从输入流读取字符的字符串,而不考虑BOM和编码。您从steam读取字符的方式转换为一个字节对一个字符的读取错误,非常错误。请使用读取器的任何实现(指定编码)从字节序列中读取字符


稍后将字符串转换回字节(在这里,您需要注意指定编码。如果您比较此时获得的字节序列,它可能与您从存储中获取的序列非常不同。

您正在构建一个从输入流读取字符的字符串,而不考虑BOM和编码。您从steam读取字符的方式转换为一个字节对一个字符的读取错误,非常错误。请使用读取器的任何实现(指定编码)从字节序列中读取字符


稍后将字符串转换回字节(在这里,您需要注意指定编码。如果您比较此时获得的字节序列,它可能与您从存储中获取的序列非常不同。

您正在构建一个从输入流读取字符的字符串,而不考虑BOM和编码。您从steam读取字符的方式转换为一个字节对一个字符的读取错误,非常错误。请使用读取器的任何实现(指定编码)从字节序列中读取字符


稍后,您将字符串转换回字节(在这里您需要注意指定编码。如果您比较此时获得的字节序列,它可能与您从存储中获取的字节序列非常不同。

您可以在BOMInputStream中包装初始流:

    InputStream stream = new BOMInputStream(inputStream);
    // code using stream goes here

通过这种方式,
stream
自动跳过BOM前缀。
BOMInputStream
存在于Apache Commons IO库中。

您可以在BOMInputStream中包装初始流:

    InputStream stream = new BOMInputStream(inputStream);
    // code using stream goes here

通过这种方式,
stream
自动跳过BOM前缀。
BOMInputStream
存在于Apache Commons IO库中。

您可以在BOMInputStream中包装初始流:

    InputStream stream = new BOMInputStream(inputStream);
    // code using stream goes here

通过这种方式,
stream
自动跳过BOM前缀。
BOMInputStream
存在于Apache Commons IO库中。

您可以在BOMInputStream中包装初始流:

    InputStream stream = new BOMInputStream(inputStream);
    // code using stream goes here

通过这种方式,
stream
自动跳过BOM前缀。
BOMInputStream
位于Apache Commons IO库中。

我目前正在考虑其他问题。是否可以只使用FileInputStream作为XmlParser的输入流?当然可以。我注意到您一次读取1个字符,这样您就可以按原样标识BOM只有当您读取了最后一个BOM字符时,才会进行追加。(顺便说一句,您可以读取更大的块,如4096,但这将使查找BOM变得不可能)我将发布另一个问题,因为我不想在m case中不必要的情况下使用BOM。我已经在内部存储器中存储了一个文件。现在我使用FileInputStream打开它。为什么我的XMLPULLPARSER无法识别它?在我的应用程序中,我在文件中放置了一个需要查找的单词。我知道这个单词存在,但应用程序不会返回它找到它的消息。我是当前正在链接其他内容。是否可以仅使用FileInputStream作为XmlParser的InputStream?当然可以。我注意到您一次读取1个字符,因此您可以在输入时标识BOM,并且仅在读取最后一个BOM字符时追加。(顺便说一句,你可以阅读更大的块,如4096,但这将使它不可能找到bom)我将发布另一个问题,因为我不想使用bom,如果没有必要在m的情况下。我已经存储了一个文件在内部