android平台下的数据存储与解析-sharedprefrences和文件存储

来源:互联网 发布:js时间相减 编辑:程序博客网 时间:2024/06/05 08:35

Android提供了5种方式来让用户保存持久化应用程序数据。根据自己的需求来做选择,比如数据是否是应用程序私有的,是否能被其他程序访问,需要多少数据存储空间等,分别是:     

① 使用SharedPreferences存储数据 

② 文件存储数据

③  SQLite数据库存储数据

④ 使用ContentProvider存储数据

⑤ 网络存储数据


1. 使用Shared Preferences

这种存储方式用于存储原始类型数据,包括boolean、int、long、float、double、String等。具体的存储方式是键-值对,若我们不主动删除,这些数据会一直存在。

SharedPreferences:(是用xml文件存放数据,文件存放在/data/data/<package name>/shared_prefs目录下)

根据以上介绍,我们很容易得出Shared Preferences适合存储的数据有:

小游戏的历史最高分(整型数据);

用户偏好设置:是否只在wifi时才加载图片(boolean型)、是否开启夜间模式(boolean型);

所有能够用原始类型所表示的用户数据..

使用:

保存数据一般分为四个步骤:

1.使用Activity类的getSharedPreferences方法获得SharedPreferences对象;

2.使用SharedPreferences接口的edit获得SharedPreferences.Editor对象;

3.通过SharedPreferences.Editor接口的putXXX方法保存key-value对;

4.通过过SharedPreferences.Editor接口的commit方法保存key-value对。



2.文件存储方式

DDMS中的FileExplorer下的data、mnt、storage三个目录,

InternalMemory:data/data目录

1.内部存储

data文件夹就是我们常说的内部存储,当我们打开data文件夹之后(没有root的手机不能打开该文件夹),里边有两个文件夹值得我们关注,如下:

一个文件夹是app文件夹,还有一个文件夹就是data文件夹,app文件夹里存放着我们所有安装的app的apk文件,其实,当我们调试一个app的时候,可以看到控制台输出的内容,有一项是uploading .....就是上传我们的apk到这个文件夹,上传成功之后才开始安装。另一个重要的文件夹就是data文件夹了,这个文件夹里边都是一些包名,打开这些包名之后我们会看到这样的一些文件:

1.data/data/包名/shared_prefs
2.data/data/包名/databases
3.data/data/包名/files

4.data/data/包名/cache

如果打开过data文件,应该都知道这些文件夹是干什么用的,我们在使用sharedPreferenced的时候,将数据持久化存储于本地,其实就是存在这个文件中的xml文件里,我们App里边的数据库文件就存储于databases文件夹中,还有我们的普通数据存储在files中,缓存文件存储在cache文件夹中,存储在这里的文件我们都称之为内部存储


ExternalMemory:mnt或者storage目录

2.外部存储

外部存储才是我们平时操作最多的,外部存储一般就是我们上面看到的storage文件夹,当然也有可能是mnt文件夹,这个不同厂家有可能不一样。

一般来说,在storage文件夹中有一个sdcard文件夹,这个文件夹中的文件又分为两类,一类是公有目录,还有一类是私有目录,其中的公有目录有九大类,比如DCIM、DOWNLOAD等这种系统为我们创建的文件夹,私有目录就是Android这个文件夹,这个文件夹打开之后里边有一个data文件夹,打开这个data文件夹,里边有许多包名组成的文件夹。



1)内部存储

当文件被保存在内部存储中时,默认情况下,文件是应用程序私有的,其他应用不能访问。当用户卸载应用程序时这些文件也跟着被删除。

文件默认存储位置:/data/data/packagename/files/文件名。

写入文件使用方法

① 调用Context的openFileOutput()函数,填入文件名和操作模式,它会返回一个FileOutputStream对象。

② 通过FileOutputStream对象的write()函数写入数据。

③  FileOutputStream对象的close ()函数关闭流。

例如:

        String FILENAME = "a.txt";

        String string = "fanrunqi";

        try {

            FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);

            fos.write(string.getBytes());

            fos.close();

        } catch (Exception e) {

            e.printStackTrace();

        }

注解:在 openFileOutput(String name, int mode)方法中

name参数: 用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,android 会自动创建它。

mode参数:用于指定操作模式,分为四种:

Context.MODE_PRIVATE = 0

为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容。

Context.MODE_APPEND = 32768

该模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。 

Context.MODE_WORLD_READABLE = 1

表示当前文件可以被其他应用读取。

MODE_WORLD_WRITEABLE

表示当前文件可以被其他应用写入。


读取一个内部存储的私有文件

① 调用openFileInput( ),参数中填入文件名,会返回一个FileInputStream对象。

② 使用流对象的 read()方法读取字节

③ 调用流的close()方法关闭流

例如:

    String FILENAME = "a.txt";

        try {

            FileInputStream inStream = openFileInput(FILENAME);

            int len = 0;

            byte[] buf = new byte[1024];

            StringBuilder sb = new StringBuilder();

            while ((len = inStream.read(buf)) != -1) {

                sb.append(new String(buf, 0, len));

            }

            inStream.close();

        } catch (Exception e) {

            e.printStackTrace();

        }


2)外部存储(sdcard

因为内部存储容量限制,有时候需要存储数据比较大的时候需要用到外部存储,使用外部存储分为以下几个步骤:

添加外部存储访问限权
    要在AndroidManifest.xml中加入访问SDCard的权限,如下:

<!-- 在SDCard中创建与删除文件权限 -->

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

   <!-- 往SDCard写入数据权限 -->

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


getExternalStorageDirectory ()

通过该方法打开外存储的根目录,你应该在以下目录下写入你的应用数据,这样当卸载应用程序时该目录及其所有内容也将被删除。

/Android/data/<package_name>/files/

读写数据:

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){  

            File sdCardDir = Environment.getExternalStorageDirectory();//获取SDCard目录  "/sdcard"        

 

               File saveFile = new File(sdCardDir,"a.txt");

 

               //写数据

                try {

                    FileOutputStream fos= new FileOutputStream(saveFile);

                    fos.write("fanrunqi".getBytes());

                    fos.close();

                } catch (Exception e) {

                    e.printStackTrace();

                }

                //读数据

                 try {

                    FileInputStream fis= new FileInputStream(saveFile);

                    int len =0;

                    byte[] buf = new byte[1024];

                    StringBuffer sb = new StringBuffer();

                    while((len=fis.read(buf))!=-1){

                        sb.append(new String(buf, 0, len));

                    }

                    fis.close();

                } catch (Exception e) {

                    e.printStackTrace();

                }  

        }

  我们也可以在 /Android/data/package_name/cache/目录下做外部缓存。