我们知道SharedPreferences只能保存简单类型的数据,例如,String、int等。
如果想用SharedPreferences存取更复杂的数据类型(类、图像等),就需要对这些数据进行编码。
我们通常会将复杂类型的数据转换成Base64编码,然后将转换后的数据以字符串的形式保存在 XML文件中。
public void saveOAuth(OAuthV1 oAuth_1) {
SharedPreferences preferences = getSharedPreferences("base64",
MODE_PRIVATE);
// 创建字节输出流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
// 创建对象输出流,并封装字节流
ObjectOutputStream oos = new ObjectOutputStream(baos);
// 将对象写入字节流
oos.writeObject(oAuth_1);
// 将字节流编码成base64的字符窜
String oAuth_Base64 = new String(Base64.encodeBase64(baos
.toByteArray()));
Editor editor = preferences.edit();
editor.putString("oAuth_1", oAuth_Base64);
editor.commit();
} catch (IOException e) {
// TODO Auto-generated
}
Log.i("ok", "存储成功");
}
之后将其解码:
public OAuthV1 readOAuth() {
OAuthV1 oAuth_1 = null;
SharedPreferences preferences = getSharedPreferences("base64",
MODE_PRIVATE);
String productBase64 = preferences.getString("oAuth_1", "");
//读取字节
byte[] base64 = Base64.decodeBase64(productBase64.getBytes());
//封装到字节流
ByteArrayInputStream bais = new ByteArrayInputStream(base64);
try {
//再次封装
ObjectInputStream bis = new ObjectInputStream(bais);
try {
//读取对象
oAuth_1 = (OAuthV1) bis.readObject();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (StreamCorruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return oAuth_1;
}
需要导入一个包:commons-codec-1.4.jar
链接内容:http://commons.apache.org/codec/download_codec.cgi
本文为《Android/OPhone开发完全讲义》一书的内容连载。转载请注明出处