zoukankan      html  css  js  c++  java
  • Android应用开发之使用SharedPreferences存储复杂类型的数据

      上一篇文章写了,关于使用SharedPreferences存储简单类型数据,下面再看看如何使用SharedPreferences存储稍微复杂点的数据。这些数据包括图片数据和对象或其它数据类型。存储这类数据,需要将其编码,将这些复杂类型的数据转换成Base64格式的编码,然后以字符串的形式保存在xml文件中。

    源代码(布局文件未贴出):

    查看源代码
     1 package android.test.sharedpreferencescomplex;
     2 
     3 import java.io.Serializable;
     4 
     5 public class MobileInfo implements Serializable {
     6 
     7 private static final long serialVersionUID = 1L;
     8 public String name;
     9 public String infoString;
    10 
    11 }
    12 
    13 
    14 
    15 package android.test.sharedpreferencescomplex;
    16 
    17 import java.io.ByteArrayInputStream;
    18 import java.io.ByteArrayOutputStream;
    19 import java.io.ObjectInputStream;
    20 import java.io.ObjectOutputStream;
    21 import android.os.Bundle;
    22 import android.app.Activity;
    23 import android.content.SharedPreferences;
    24 import android.content.SharedPreferences.Editor;
    25 import android.graphics.Bitmap.CompressFormat;
    26 import android.graphics.BitmapFactory;
    27 import android.graphics.drawable.Drawable;
    28 import android.util.Base64;
    29 import android.view.Menu;
    30 import android.view.View;
    31 import android.widget.ImageView;
    32 import android.widget.Toast;
    33 
    34 public class MainActivity extends Activity {
    35 
    36 @Override
    37 public void onCreate(Bundle savedInstanceState) {
    38 super.onCreate(savedInstanceState);
    39 setContentView(R.layout.activity_main);
    40 }
    41 
    42 
    43 public void onclick_Write_Image(View v) throws Throwable {
    44 SharedPreferences sharedPreferences = getSharedPreferences("complex", Activity.MODE_PRIVATE);
    45 Editor editor = sharedPreferences.edit();
    46 ByteArrayOutputStream byteArrayOutputStream =new ByteArrayOutputStream();
    47 BitmapFactory.decodeResource(getResources(), R.drawable.image1).compress(CompressFormat.JPEG, 50, byteArrayOutputStream);
    48 String imageString = new String(Base64.encode(byteArrayOutputStream.toByteArray(),Base64.DEFAULT));
    49 editor.putString("image", imageString);
    50 editor.commit();
    51 byteArrayOutputStream.close();    
    52 }
    53 
    54 public void onclick_Read_Image(View view) throws Throwable {
    55 SharedPreferences sharedPreferences = getSharedPreferences("complex",Activity.MODE_PRIVATE);
    56 String string = sharedPreferences.getString("image", "");
    57 byte[] imageBytes = Base64.decode(string.getBytes(), Base64.DEFAULT);
    58 ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(imageBytes);
    59 ImageView imageView =(ImageView)findViewById(R.id.imageView1);
    60 imageView.setImageDrawable(Drawable.createFromStream(byteArrayInputStream, "image"));
    61 byteArrayInputStream.close();
    62 
    63 }
    64 public void onclick_Write_Data(View view) throws Throwable
    65 {
    66 MobileInfo mobile = new MobileInfo();
    67 
    68 mobile.name = "魅族";
    69 mobile.infoString = "魅族MX";
    70 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    71 ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
    72 objectOutputStream.writeObject(mobile);
    73 SharedPreferences sharedPreferences = getSharedPreferences("complex", Activity.MODE_PRIVATE);
    74 Editor editor = sharedPreferences.edit();
    75 sharedPreferences = getSharedPreferences("complex",Activity.MODE_PRIVATE);
    76 String mobilesString = new String(Base64.encode(byteArrayOutputStream.toByteArray(),Base64.DEFAULT));
    77 editor.putString("mobile", mobilesString);
    78 editor.commit();
    79 objectOutputStream.close();
    80 }
    81 
    82 public void onclick_Read_Data(View view) throws Throwable, Throwable
    83 {
    84 
    85 SharedPreferences sharedPreferences = getSharedPreferences("complex", Activity.MODE_PRIVATE);
    86 String mobilesString = sharedPreferences.getString("mobile", "");
    87 byte[] mobileBytes = Base64.decode(mobilesString.getBytes(),Base64.DEFAULT);
    88 ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(mobileBytes);
    89 ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
    90 MobileInfo mobileInfo = (MobileInfo) objectInputStream.readObject();
    91 Toast.makeText(this,"手机品牌:" + mobileInfo.name + "\n手机型号:" + mobileInfo.infoString,
    92 Toast.LENGTH_LONG).show();
    93 objectInputStream.close();
    94 
    95 
    96 }
    97 
    98 }

      一.保存图片文件

      首先,将这些数据类型编码成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();

                                          

                       图.程序运行结果

  • 相关阅读:
    转转帖.NET.GC 浅谈.net托管程序中的资源释放问题 (转帖)
    [转]来谈谈从专业到更专业
    [转]ASP.NET中多国语言的实现
    [转]内向的人如何建立人际网络
    SQL 入门 (代码)
    SQL 查询 (代码)
    关于学生信息处理小代码
    SQL 函数 (代码)
    SQL 链接 (代码)
    SQL 数据表的相关操作
  • 原文地址:https://www.cnblogs.com/ikarl/p/2768344.html
Copyright © 2011-2022 走看看