Android的数据存储方式(二)

来源:互联网 发布:linux性能分析工具 编辑:程序博客网 时间:2024/06/07 06:43

 继续上一篇的内容,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()
其他都是一样的!


好的,今天就到这啦,鄙人新手,博文中有错的,欢迎大家指出!晚安!

今天2016.10.22,台风海马登陆成功,袭击汕头,















 

0 0
原创粉丝点击