我开发我的Android应用程序,使数据备份和恢复的新功能。 我使用的XML文件来备份数据。 这是一段代码,设置编码的输出文件:
XmlSerializer serializer = Xml.newSerializer();
FileWriter fileWriter = new FileWriter(file, false);
serializer.setOutput(fileWriter);
serializer.startDocument("UTF-8", true);
[... Write data to the file....]
这是我尝试从一个XML文件导入数据。 首先,我检查,如果编码是正确的:
XmlPullParser parser = Xml.newPullParser();
FileReader reader = new FileReader(file);
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(reader);
if(!"UTF-8".equals(parser.getInputEncoding())) {
throw new IOException("Incorrect file encoding");
}
[... Read data from the file....]
在这里,我遇到了一个问题。 此代码工作正常在Android 2.3.3(两者装置和仿真器),编码被正确地检测为“UTF-8”。 但在API11 +版本(蜂窝,ICS,JB)抛出异常。 当我在调试模式下运行,这是我可以看到parser.getInputEncoding()返回null
。 我检查2.3.3和更高版本产生的实际的XML文件并且它们具有完全相同的标头: <?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
。 为什么getInputEncoding()上API11 +返回null?
其他的研究结果:
我发现有一种方法来正确检测使用API11 +设备文件编码FileInputStream
代替FileReader
是这样的:
XmlPullParser parser = Xml.newPullParser();
FileInputStream stream = new FileInputStream(file);
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(stream, null);
if(!"UTF-8".equals(parser.getInputEncoding())) {
throw new IOException("Incorrect file encoding");
}
[... Read data from the file....]
在这种情况下getInputEncoding()适当地检测在API11 +仿真器和设备UTF-8编码的,但它在2.3.3返回null。 所以现在我可以在代码中插入一个叉使用的FileReader上API11 +和的FileInputStream上预API11:
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
parser.setInput(stream, null);
} else {
parser.setInput(reader);
}
但是,什么是检查与XmlPullParser.getInputEncoding编码()的正确方法? 为什么不同的Android版本不同的表现取决于我用哪一个:或的FileInputStream的FileReader?