继续上一篇的内容,Androidd 的数据存储方式之:SharedPreferences。
 SharedPerferences 是一个轻量级的存储类,一般用来存储一些简单的参数。数据以xml文件的方式存储,放在/data/data/<package name>/shared_prefs 目录下

SharedPreferences的使用非常简单,通常有两种方法去获取它:

一种是通过Context对象的 getSharedPerferences()获取的SharedPerferences对象可以被整个应用所使用

另一种是通过Activity对象的 getSharedPerferences()获取的SharedPerferences对象只能被当前Activity所使用

SharedPerferences对象的获取为:  

代码如下:

<span style="font-family:FangSong_GB2312;font-size:18px;">/*两个参数
        //参数一:为保存的xml的文件名
        //参数二:为操作方式
        Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
        Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.
        Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件.
        MODE_WORLD_READABLE:表示当前文件可以被其他应用读取.
        MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入.
        */
        SharedPreferences shardPreference = this.getSharedPreferences("SPDemo",Context.MODE_APPEND);
        //用Context 的方式获取
        //SharedPreferences sharedPreferences2 = getApplication().getSharedPreferences("spdemo",Context.MODE_APPEND);
        SharedPreferences.Editor editor = shardPreference.edit();
        editor.putString("name","Linliterwhite");
        editor.commit();</span>

以上是对SharedPerferences进行存储数据,接下来我们来读取其中的数据。

//首先获取SharedPerferences对象,然后通过getXXX() 方法通过匹对键获取相应的值
        SharedPreferences getData= this.getSharedPreferences("SPDemo",Context.MODE_APPEND);
        String name = getData.getString("name",null);

到这里SharedPerferences就介绍完了,那么对于初学者可能有一个地方不懂的就是Editor 这个对象是什么鬼?

官方api解释:

    Interface used for modifying values in a SharedPreferences object. All changes you make in an editor are batched, and not copied back to the original SharedPreferences or persistent storage until you call commit().

大意就是:editor是一个用来改变SharedPerferences对象中的值的接口,你可以在改变SharedPerferences中的值直到使用commit() 方法后。(英语水平很一般,粗略翻译)

在上面大家也可以看到,editor的使用和Map有点类似,都是健值对应的。所以初学者前期可以把它看成类似于map的专属于SharedPerferences中的数据类型。

接下来我来接受文件存储

文件存储,数据以 I/O 流的形式把数据存入手机内存或者手机SD卡,可以存储大数据,如音乐,图片,视频等。

文件存储其实就是把Java中的文件操作应用到Android手机。说到底就是I/O操作,文件默认会存储到/data/data/package/files中。

文件操作需要以下权限

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>  
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

  需要知道的两个概念

当数据从内存传入硬盘时,为输出流

但数据从硬盘传入内存时,为输入流

直接贴代码

String fileData = "This is Test!";
        try {
            //获取一个名为FileDemo 的文件,第二个参数与SharedPerferences相似
            /*参数二:为操作方式
            1.Context.MODE_PRIVATE:私有覆盖模式
            只能被当前应用访问,并且如果写入,则覆盖;
            2.Context.MODE_APPEND:私有追加模式
            只能被当前应用访问,并且如果写入,则追加;
            3.Context,MODE_WORLD_READABLE:公有只读模式
            可以被其他应用读取;
            4.Context.MODE_WORLD_WRITEABLE:公有可写模式
            可以被其他应用写入,但不能读取;

            注意,如果希望其他使得文件模式叠加,则可以使用加号连接;
            比如:Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE 表示其他应用读写;
            */
            FileOutputStream outputStream = openFileOutput("FileDemo",Context.MODE_APPEND);
            //  I/O操作,调用write() 方法,直接写入
            outputStream.write(fileData.getBytes());
            outputStream.close();//最后不要忘记关闭输出流
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

文件写入数据

try {
            //获取名为FileDemo 的文件的输入流
            FileInputStream inputStream = openFileInput("FIleDemo");
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            byte b[] = new byte[1024];
            int len = 0;
            while((len = inputStream.read(b))!=-1){
                byteArrayOutputStream.write(b);

            }
            inputStream.close();
            byteArrayOutputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

以上文件操作都类似Java的文件I/O操作,但Android手机还有一点就是有sd卡。很多文件我们应该放到sd卡,不然会占用手机存储空间,这时我们就得判断手机是否有sd卡。使用 

Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) 就可以判断是否有sd卡

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            File f = new File(Environment.getExternalStorageDirectory(),"SDFile");
            FileOutputStream out = null;
            try {
                out = new FileOutputStream("SDFile",true);
                out.write(fileData.getBytes("UTF-8"));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
File fin = new File(Environment.getExternalStorageDirectory(),"SDFile");
            try {
                FileInputStream fileInputStream  = new FileInputStream(fin) ;
                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                byte[] bb = new byte[1024];
                int len = 0;
                while((len = fileInputStream.read(bb))!=-1){
                    byteArrayOutputStream.write(bb);
                    
                }
                fileInputStream.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

相比之下,大家可以看到,差别就是SD卡的存储多了一个获取绝对路径:

Environment.getExternalStorageDirectory()

其他都是一样的!