Android应用开发之使用SharedPreferences存储复杂类型的数据
2012-11-13 17:13
597 查看
上一篇文章写了,关于使用SharedPreferences存储简单类型数据,下面再看看如何使用SharedPreferences存储稍微复杂点的数据。这些数据包括图片数据和对象或其它数据类型。存储这类数据,需要将其编码,将这些复杂类型的数据转换成Base64格式的编码,然后以字符串的形式保存在xml文件中。
源代码(布局文件未贴出):
查看源代码
一.保存图片文件
首先,将这些数据类型编码成Base64格式,实例化一个ByteArrayOutputStream对象,原来装载压缩后的字节文件。很多人接触ByteArrayOutputStream时不了解,为什么有了FlileOutputStream还需要ByteArrayOutputStream,这就是一个很好的例子。ByteArrayOutputStream用来装载需要缓冲的字节文件,而不当成文件写入磁盘。
ByteArrayOutputStream byteArrayOutputStream =new ByteArrayOutputStream();
//然后我们使用BitmapFactory获得我们要压缩的文件,再用compress方法压缩并保存到byteArrayOutputStream。
BitmapFactory.decodeResource(getResources(), R.drawable.image1).compress(CompressFormat.JPEG, 50, byteArrayOutputStream);
//最后,用Base64.encode将字节文件转换成Base64编码保存在String中。
String imageString = new String(Base64.encode(byteArrayOutputStream.toByteArray(),Base64.DEFAULT));
byteArrayOutputStream.close();
得到图片的String后,我们就可以像上篇文章中一样使用SharedPreferences保存这个数据了。
//下面代码将告诉我们如何从文件中读取保存的图片信息。
//定义一个byte类型的数组,对Base64格式的字符串进行解码,还原成字节数组。
byte[] imageBytes = Base64.decode(string.getBytes(), Base64.DEFAULT);
//然后讲imageBytes装载到ByteArrayInputStream。
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(imageBytes);
//最后,用Drawable的createFromSteam方法将byteArrayInputStream编译成图片文件。
ImageView imageView =(ImageView)findViewById(R.id.imageView1);
imageView.setImageDrawable(Drawable.createFromStream(byteArrayInputStream, "image"));
byteArrayInputStream.close();
二.保存对象
建立一个类,实例化一个对象
public class MobileInfo implements Serializable {
//该类实现Serializable接口,以启用其序列化功能
private static final long serialVersionUID = 1L;
public String name;
public String infoString;
}
MobileInfo mobile = new MobileInfo();
mobile.name = "魅族";
mobile.infoString = "魅族MX";
//和保存图片一样,首先要将数据编码成Base64格式,实例化一个ByteArrayOutputStream对象,原来装载压缩后的字节文件。
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
//然后将得到的字符数据装载到ObjectOutputStream。
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
//writeObject 方法负责写入特定类的对象的状态,以便相应的 readObject 方法可以还原它。
objectOutputStream.writeObject(mobile);
//最后,用Base64.encode将字节文件转换成Base64编码保存在String中
String mobilesString = new String(Base64.encode(byteArrayOutputStream.toByteArray(),Base64.DEFAULT));
//关闭objectOutputStream
objectOutputStream.close();
//下面代码将告诉我们如何从文件中读取保存的对象,参考图片的读取方法,相信大家能看懂,我就不再解释了
byte[] mobileBytes = Base64.decode(mobilesString.getBytes(),Base64.DEFAULT);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(mobileBytes);
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
MobileInfo mobileInfo = (MobileInfo) objectInputStream.readObject();
objectInputStream.close();
图.程序运行结果
源代码(布局文件未贴出):
查看源代码
package android.test.sharedpreferencescomplex; import java.io.Serializable; public class MobileInfo implements Serializable { private static final long serialVersionUID = 1L; public String name; public String infoString; } package android.test.sharedpreferencescomplex; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import android.os.Bundle; import android.app.Activity; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.graphics.Bitmap.CompressFormat; import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; import android.util.Base64; import android.view.Menu; import android.view.View; import android.widget.ImageView; import android.widget.Toast; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void onclick_Write_Image(View v) throws Throwable { SharedPreferences sharedPreferences = getSharedPreferences("complex", Activity.MODE_PRIVATE); Editor editor = sharedPreferences.edit(); ByteArrayOutputStream byteArrayOutputStream =new ByteArrayOutputStream(); BitmapFactory.decodeResource(getResources(), R.drawable.image1).compress(CompressFormat.JPEG, 50, byteArrayOutputStream); String imageString = new String(Base64.encode(byteArrayOutputStream.toByteArray(),Base64.DEFAULT)); editor.putString("image", imageString); editor.commit(); byteArrayOutputStream.close(); } public void onclick_Read_Image(View view) throws Throwable { SharedPreferences sharedPreferences = getSharedPreferences("complex",Activity.MODE_PRIVATE); String string = sharedPreferences.getString("image", ""); byte[] imageBytes = Base64.decode(string.getBytes(), Base64.DEFAULT); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(imageBytes); ImageView imageView =(ImageView)findViewById(R.id.imageView1); imageView.setImageDrawable(Drawable.createFromStream(byteArrayInputStream, "image")); byteArrayInputStream.close(); } public void onclick_Write_Data(View view) throws Throwable { MobileInfo mobile = new MobileInfo(); mobile.name = "魅族"; mobile.infoString = "魅族MX"; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); objectOutputStream.writeObject(mobile); SharedPreferences sharedPreferences = getSharedPreferences("complex", Activity.MODE_PRIVATE); Editor editor = sharedPreferences.edit(); sharedPreferences = getSharedPreferences("complex",Activity.MODE_PRIVATE); String mobilesString = new String(Base64.encode(byteArrayOutputStream.toByteArray(),Base64.DEFAULT)); editor.putString("mobile", mobilesString); editor.commit(); objectOutputStream.close(); } public void onclick_Read_Data(View view) throws Throwable, Throwable { SharedPreferences sharedPreferences = getSharedPreferences("complex", Activity.MODE_PRIVATE); String mobilesString = sharedPreferences.getString("mobile", ""); byte[] mobileBytes = Base64.decode(mobilesString.getBytes(),Base64.DEFAULT); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(mobileBytes); ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream); MobileInfo mobileInfo = (MobileInfo) objectInputStream.readObject(); Toast.makeText(this,"手机品牌:" + mobileInfo.name + "\n手机型号:" + mobileInfo.infoString, Toast.LENGTH_LONG).show(); objectInputStream.close(); } }
一.保存图片文件
首先,将这些数据类型编码成Base64格式,实例化一个ByteArrayOutputStream对象,原来装载压缩后的字节文件。很多人接触ByteArrayOutputStream时不了解,为什么有了FlileOutputStream还需要ByteArrayOutputStream,这就是一个很好的例子。ByteArrayOutputStream用来装载需要缓冲的字节文件,而不当成文件写入磁盘。
ByteArrayOutputStream byteArrayOutputStream =new ByteArrayOutputStream();
//然后我们使用BitmapFactory获得我们要压缩的文件,再用compress方法压缩并保存到byteArrayOutputStream。
BitmapFactory.decodeResource(getResources(), R.drawable.image1).compress(CompressFormat.JPEG, 50, byteArrayOutputStream);
//最后,用Base64.encode将字节文件转换成Base64编码保存在String中。
String imageString = new String(Base64.encode(byteArrayOutputStream.toByteArray(),Base64.DEFAULT));
byteArrayOutputStream.close();
得到图片的String后,我们就可以像上篇文章中一样使用SharedPreferences保存这个数据了。
//下面代码将告诉我们如何从文件中读取保存的图片信息。
//定义一个byte类型的数组,对Base64格式的字符串进行解码,还原成字节数组。
byte[] imageBytes = Base64.decode(string.getBytes(), Base64.DEFAULT);
//然后讲imageBytes装载到ByteArrayInputStream。
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(imageBytes);
//最后,用Drawable的createFromSteam方法将byteArrayInputStream编译成图片文件。
ImageView imageView =(ImageView)findViewById(R.id.imageView1);
imageView.setImageDrawable(Drawable.createFromStream(byteArrayInputStream, "image"));
byteArrayInputStream.close();
二.保存对象
建立一个类,实例化一个对象
public class MobileInfo implements Serializable {
//该类实现Serializable接口,以启用其序列化功能
private static final long serialVersionUID = 1L;
public String name;
public String infoString;
}
MobileInfo mobile = new MobileInfo();
mobile.name = "魅族";
mobile.infoString = "魅族MX";
//和保存图片一样,首先要将数据编码成Base64格式,实例化一个ByteArrayOutputStream对象,原来装载压缩后的字节文件。
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
//然后将得到的字符数据装载到ObjectOutputStream。
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
//writeObject 方法负责写入特定类的对象的状态,以便相应的 readObject 方法可以还原它。
objectOutputStream.writeObject(mobile);
//最后,用Base64.encode将字节文件转换成Base64编码保存在String中
String mobilesString = new String(Base64.encode(byteArrayOutputStream.toByteArray(),Base64.DEFAULT));
//关闭objectOutputStream
objectOutputStream.close();
//下面代码将告诉我们如何从文件中读取保存的对象,参考图片的读取方法,相信大家能看懂,我就不再解释了
byte[] mobileBytes = Base64.decode(mobilesString.getBytes(),Base64.DEFAULT);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(mobileBytes);
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
MobileInfo mobileInfo = (MobileInfo) objectInputStream.readObject();
objectInputStream.close();
图.程序运行结果
相关文章推荐
- Android应用开发SharedPreferences存储数据的使用方法
- Android应用开发SharedPreferences存储数据的使用方法
- Android应用开发SharedPreferences存储数据的使用方法
- Android应用开发SharedPreferences存储数据的使用方法
- Android应用开发SharedPreferences存储数据的使用方法
- Android应用开发SharedPreferences存储数据的使用方法
- 【Mark】Android应用开发SharedPreferences存储数据的使用方法
- Android应用开发SharedPreferences存储数据的使用方法
- Android应用开发SharedPreferences存储数据的使用方法
- Android应用开发SharedPreferences存储数据的使用方法
- Android应用开发SharedPreferences存储数据的使用方法
- Android应用开发SharedPreferences存储数据的使用方法
- Android应用开发SharedPreferences存储数据的使用方法
- Android应用开发SharedPreferences存储数据的使用方法
- android应用开发SharedPreferences存储数据的使用方法
- Android应用开发SharedPreferences存储数据的使用方法
- Android应用开发SharedPreferences存储数据的使用方法
- Android应用开发SharedPreferences存储数据的使用方法
- Android应用开发SharedPreferences存储数据的使用方法
- Android应用开发SharedPreferences存储数据的使用方法