要实现存取复杂类型的数据(Java类,图像等),需要对这些数据进行编码,通常将复杂类型的数据转换成 Base64 编码,然后将转换后的数据以字符串的形式保存在XML文件中
编码 存入
存入过程: 由ByteArrayOutputStream—————>Base 64编码字符—————>SharedPreferences
解码 转换
取出过程: 由XML文件读取字符—————>字节数组—————>字节数组读取流(ByteArrayInputStream)
Android SDK1.5 并未提供Base64 编码和解码,因此,需要使用第三方jar包,在这里使用Apache Commons组件中的Codec组件实现,
可以从以下地址下载 http://commons.apache.org/codec/download_codec.cgi, 下载后包名为commons-codec-1.4.jar
本示例将一个User 类的对象实例和一个图像保存在XML文件中,并在程序重新运行后从XML文件装载User 对象和图像
将 User 对象保存在XML文件中的代码,即存入过程,如下:
ByteArrayOutputStream baos = new ByteArrayOutputStream(); //1.定义字节数组写入流
ObjectOutputStream oos = new ObjectOutputStream(baos); //2.将字节数组写入流转换成对象写入流
oos.writeObject(user); //3. 将user对象写到OutputStream
mySharedPreferences = getSharedPreferences("base64", Activity.MODE_PRIVATE);
String userBase64 = new String(Base64.encodeBase64(baos.toByteArray())); //4. 将user对象转换成byte数组,并将其进行Base64编码,得到Base64编码字符串
SharedPreferences.Editor editor = mySharedPreferences.edit();
editor.putString("user", userBase64); //5. 将Base64编码字符串写到base64.xml文件中
editor.commit();
将XML文件读取数据装载到User对象和图像的代码,即取出过程,如下:
String userBase64 = mySharedPreferences.getString("user", ""); //1.取得Base64编码字符
base64Bytes = Base64.decodeBase64(userBase64.getBytes()); //2.解码为字节数组
bais = new ByteArrayInputStream(base64Bytes); //3. 转换为字节数组读取流
ObjectInputStream ois = new ObjectInputStream(bais); //4. 转换为对象读取流
User user = (User) ois.readObject(); //5. 从InputStream中读取user对象
示意图见
具体代码请参见 ch06_base64sharedpreferences工程