您的位置:首页 > 移动开发 > Android开发

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;
}
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android xml