在frameworks中使用了大量的xml进行数据保存,列如frameworks/base/services/core/java/com/android/server/pm/Settings.java
源码中将已安装的包名进行了相关实践。因此在自行实现的xml中可参考以下实现。
boolean readLPw(@NonNull List<UserInfo> users) {
FileInputStream str = null;
try {
if (str == null) {
if (!mSettingsFilename.exists()) {//如果文件不存在则进行返回
return false;
}
str = new FileInputStream(mSettingsFilename);
}
//实例化XmlPullParser对象
XmlPullParser parser = Xml.newPullParser();
parser.setInput(str, StandardCharsets.UTF_8.name());//设置输入流
//检查是否可以读取到START_TAG或者END_DOCUMENT
int type;
while ((type = parser.next()) != XmlPullParser.START_TAG
&& type != XmlPullParser.END_DOCUMENT) {
;
}
//若没有读取到开始标签则表示不合法
if (type != XmlPullParser.START_TAG) {
return false;
}
//获取元素深度
int outerDepth = parser.getDepth();
//如果没有读取到文档结尾并且(不是结束标签或者元素深度没有达到最大)则进行读取
while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
&& (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
//如果直接读取到了元素结尾或者读取到了元素中间的文本则跳过
if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
continue;
}
String tagName = parser.getName();
/**
*解析package节点
*/
if (tagName.equals("package")) {
readPackageLPw(parser);
} else if (tagName.equals("permissions")) {
mPermissions.readPermissions(parser);
}
//解析到其它节点逻辑
。。。。。。。。
else {
//若这个节点是无法解析的则进行跳过
XmlUtils.skipCurrentTag(parser);
}
}
str.close();
} catch (XmlPullParserException e) {
} catch (java.io.IOException e) {
}
return true;
}
void writeLPr() {
try {
//实例化输出流
FileOutputStream fstr = new FileOutputStream(mSettingsFilename);
BufferedOutputStream str = new BufferedOutputStream(fstr);
//XmlSerializer构建解析器
XmlSerializer serializer = new FastXmlSerializer();
//设置输出流以及编码
serializer.setOutput(str, StandardCharsets.UTF_8.name());
//设置开始标签
serializer.startDocument(null, true);
//定义Feature属性
serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
//设置开始标签
serializer.startTag(null, "packages");
//迭代数据并写入相应的子标签
for (int i = 0; i < mVersion.size(); i++) {
final String volumeUuid = mVersion.keyAt(i);
final VersionInfo ver = mVersion.valueAt(i);
serializer.startTag(null, TAG_VERSION);
XmlUtils.writeStringAttribute(serializer, ATTR_VOLUME_UUID, volumeUuid);
XmlUtils.writeIntAttribute(serializer, ATTR_SDK_VERSION, ver.sdkVersion);
XmlUtils.writeIntAttribute(serializer, ATTR_DATABASE_VERSION, ver.databaseVersion);
XmlUtils.writeStringAttribute(serializer, ATTR_FINGERPRINT, ver.fingerprint);
serializer.endTag(null, TAG_VERSION);
}
//设置结束标签
serializer.endTag(null, "packages");
//结束文档
serializer.endDocument();
//写入完成
str.flush();
//同步到本地磁盘
FileUtils.sync(fstr);
//关闭流
str.close();
} catch(java.io.IOException e) {
}
}