我试图弄清楚如何在使用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
的不同班级中。
答案 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转换回字节(并且您需要注意指定编码。如果您比较此时获得的字节序列,它可能与您从商店中获取的字节序列非常不同。