android 5.0 实现xml文件的解释,读写操作
2015-11-27 16:37
441 查看
前几天因需要实现多用户的功能,不同用户的配置信息保存到对应用户的目录下,故涉及到特定目录下的xml文件解释,读写操作的实现,
现把实现代码分享,供参考:
现把实现代码分享,供参考:
public class UsersUtil { private static final String TAG = "UsersUtil"; /** preference for saving the current user info */ private static final String PREFERENCE_CURRENT_USER = "current_user"; private static final String DEFUALT_USER_XML = "users.xml"; private static final String XML_DOC_TAG_USERS = "users"; private static final String XML_DOC_TAG_USER = "user"; private static final String XML_DOC_TAG_NAME = "name"; private static final String XML_DOC_TAG_PW = "password"; private static final String XML_DOC_TAG_ATTRIBUTE_ID = "id"; public static final String SEED_AES = "238990341234"; public static final String PATH_USER_INFO_DIRECTORY = "/data/xxx/"; /** the max length of the finger name and user name * because the user name is used for create the userInfo folder * so can't be too long*/ public static final int MAX_NAME_LENGTH = 10; public static final int MAX_USERS = 100; public static final char[] NAME_ENABLE_CHARS = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '-', '_', ':' }; private static ArrayList userList = null; private static Context mContext; public static void init(Context context) { mContext = context; if (userList == null) { userList = new ArrayList(); } userList.clear(); boolean result = initDataFile(); Log.i(DataUtil.TAG_LOG, TAG + " init, pathPrefix: " + PATH_USER_INFO_DIRECTORY + ", initDataFile result: " + result); try { parseXmlFromLocal(PATH_USER_INFO_DIRECTORY + DEFUALT_USER_XML); } catch (Exception e) { // e.printStackTrace(); Log.e(DataUtil.TAG_LOG, TAG + " init user error, " + e); } // if not exist any user info, initialize one if (userList.size() == 0) { UserInfo user = new UserInfo(); user.setId(0); user.setName("Default"); String pw = "qqqq"; try { pw = AESEncryptor.encrypt(SEED_AES, pw); } catch (Exception e) { // e.printStackTrace(); Log.e(DataUtil.TAG_LOG, TAG + " init user, " + "password encrypt failed, " + e); } user.setPassword(pw); userList.add(user); // save the user info into XML saveUserInfoToXml(mContext, userList); } initCurrentUser(); } public static boolean saveUserInfoToXml(Context context, ArrayList userList) { File file = new File(PATH_USER_INFO_DIRECTORY + DEFUALT_USER_XML); if (!file.exists()) { boolean result = initDataFile(); if (!result) { Log.e(DataUtil.TAG_LOG, TAG + " saveUserInfoToXml, " + "File create failed."); } } OutputStream out = null; try { out = new FileOutputStream(file); // out = context.openFileOutput(PATH_USER_INFO_DIRECTORY // + DEFUALT_USER_XML, Context.MODE_PRIVATE); // OutputStreamWriter outw = new OutputStreamWriter(out); return writeDataToXml(userList, out); } catch (FileNotFoundException e) { // e.printStackTrace(); Log.e(DataUtil.TAG_LOG, TAG + " saveUserInfoToXml, " + "FileNotFoundException, " + e); return false; } catch (Exception e) { // e.printStackTrace(); Log.e(DataUtil.TAG_LOG, TAG + " saveUserInfoToXml, " + "occurs error, " + e); return false; } finally { if (out != null) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } } public static ArrayList getUserList() { return userList; } private static void initCurrentUser() { FpControllerNative controllerNative = FpControllerNative.getInstance(); controllerNative.initFPSystem(); SLFpsvcIndex fpsvcIndex = controllerNative.GetFpInfo(); int currentUserID = fpsvcIndex.userid; Log.e(DataUtil.TAG_LOG, TAG + " initCurrentUser, currentUserID: " + currentUserID); for (UserInfo user : userList) { if (user.getId() == currentUserID) { setCurrentUser(mContext, user); } } controllerNative.destroyFPSystem(); } private static boolean initDataFile() { File file = new File(PATH_USER_INFO_DIRECTORY + DEFUALT_USER_XML); if (!file.exists()) { try { File parentDirectory = file.getParentFile(); if (parentDirectory != null && !parentDirectory.exists()) { parentDirectory.mkdirs(); } return file.createNewFile(); } catch (IOException e) { // e.printStackTrace(); Log.e(DataUtil.TAG_LOG, TAG + " initDataFile, " + "File create failed, " + e); } return false; } return true; } private static List parseXmlFromLocal(String filePath) throws Exception { File file = new File(filePath); if (!file.exists()) { Log.e(DataUtil.TAG_LOG, TAG + " parseXmlFromLocal file not exists"); return null; } FileInputStream fis = new FileInputStream(file); XmlPullParser parser = Xml.newPullParser(); parser.setInput(fis, "UTF-8"); int eventType = parser.getEventType(); UserInfo user = null; while (eventType != XmlPullParser.END_DOCUMENT) { String tagName = parser.getName(); switch (eventType) { case XmlPullParser.START_TAG: if (XML_DOC_TAG_USERS.equals(tagName)) { // userList = new ArrayList(); } else if (XML_DOC_TAG_USER.equals(tagName)) { user = new UserInfo(); String id = parser.getAttributeValue(null, XML_DOC_TAG_ATTRIBUTE_ID); user.setId(Integer.valueOf(id)); } else if (XML_DOC_TAG_NAME.equals(tagName)) { String text = parser.nextText(); user.setName(text); } else if (XML_DOC_TAG_PW.equals(tagName)) { String text = parser.nextText(); user.setPassword(text); } break; case XmlPullParser.END_TAG: if (XML_DOC_TAG_USER.equals(tagName)) { if (userList.size() < MAX_USERS) { userList.add(user); } else { Log.e(DataUtil.TAG_LOG, TAG + " parseXmlFromLocal" + " userList reach the max size."); } } break; default: break; } eventType = parser.next(); } fis.close(); return userList; } private static boolean writeDataToXml(ArrayList userList, OutputStream out) { if (userList == null || userList.size() == 0) { Log.e(DataUtil.TAG_LOG, TAG + " writeDataToXml userList is empty"); return false; } try { String enter = System.getProperty("line.separator"); XmlSerializer serializer = Xml.newSerializer(); serializer.setOutput(out, "UTF-8"); serializer.startDocument("UTF-8", true); // add the line separator serializer.text(enter); serializer.startTag(null, XML_DOC_TAG_USERS); // add the line separator serializer.text(enter); for (UserInfo user : userList) { serializer.startTag(null, XML_DOC_TAG_USER); serializer.attribute(null, XML_DOC_TAG_ATTRIBUTE_ID, user.getId() .toString()); // add the line separator serializer.text(enter); serializer.startTag(null, XML_DOC_TAG_NAME); serializer.text(user.getName().toString()); serializer.endTag(null, XML_DOC_TAG_NAME); // add the line separator serializer.text(enter); serializer.startTag(null, XML_DOC_TAG_PW); serializer.text(user.getPassword()); serializer.endTag(null, XML_DOC_TAG_PW); // add the line separator serializer.text(enter); serializer.endTag(null, XML_DOC_TAG_USER); // add the line separator serializer.text(enter); } serializer.endTag(null, XML_DOC_TAG_USERS); serializer.endDocument(); out.flush(); out.close(); return true; } catch (Exception e) { Log.e(DataUtil.TAG_LOG, TAG + " writeDataToXml occurs exception, " + e); return false; } } public static UserInfo getCurrentUser(Context context) { SharedPreferences sp = context.getSharedPreferences( PREFERENCE_CURRENT_USER, Activity.MODE_PRIVATE); String id = sp.getString(XML_DOC_TAG_ATTRIBUTE_ID, ""); String name = sp.getString(XML_DOC_TAG_NAME, ""); String pw = sp.getString(XML_DOC_TAG_PW, ""); if (TextUtils.isEmpty(id) || TextUtils.isEmpty(name)) { return userList.get(0); } UserInfo user = new UserInfo(); user.setId(Integer.valueOf(id)); user.setName(name); user.setPassword(pw); return user; } public static boolean setCurrentUser(Context context, UserInfo user) { Log.i(DataUtil.TAG_LOG, TAG + " setCurrentUser userInfo: " + user.toString()); SharedPreferences sp = context.getSharedPreferences( PREFERENCE_CURRENT_USER, Activity.MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); String id = user.getId().toString(); String name = user.getName(); String pw = user.getPassword(); editor.putString(XML_DOC_TAG_ATTRIBUTE_ID, id); editor.putString(XML_DOC_TAG_NAME, name); editor.putString(XML_DOC_TAG_PW, pw); return editor.commit(); } /** * 循环删除对应目录,及该目录下的文件数据 */ public static boolean recursionDeleteFile(File file) { if (file == null) { Log.e(DataUtil.TAG_LOG, TAG + " recursionDeleteFile file is null"); return false; } if (file.isDirectory()) { File[] childFiles = file.listFiles(); if (childFiles == null || childFiles.length == 0) { Log.i(DataUtil.TAG_LOG, TAG + " recursionDeleteFile directoryName: " + file.getName()); return file.delete(); } for (File f : childFiles) { recursionDeleteFile(f); } Log.i(DataUtil.TAG_LOG, TAG + " recursionDeleteFile directoryName: " + file.getName()); return file.delete(); } else { if (file.exists()) { Log.i(DataUtil.TAG_LOG, TAG + " recursionDeleteFile fileName: " + file.getName()); return file.delete(); } else { Log.i(DataUtil.TAG_LOG, TAG + " recursionDeleteFile fileName: " + file.getName() + " not exists"); return false; } } } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories