Android的文件存储

数据存储

Android的数据存储有5种,分别为文件存储,SharedPreferences、SQLite数据库、ContentProvifer以及网络存储。

  • 文件存储:常用的存储方式,读写文件,与Java中实现I/O程序完全一样。
    • 有两种形式:XML以及JSON。
  • SharedPreferences:存储一些简单的信息的一种机制。采用XML格式将数据存储到设备中,可以存储用户的各种配置信息如用户名和密码等。
  • SQLite数据库:Android自带的数据库,支持基本的SQL语法。一般用作复杂数据的存储引擎。
  • ContentProvifer:Android四大组件之一,主要用于不同程序之间的数据交换。将自己的数据共享给其他人。
  • 网络存储:将数据存储在服务器上,通过网络提供存储空间来获得数据信息。

集中方法各有优缺点,根据性能需求,空间需求,等来确定选择哪种存储方式。

一、文件存储

通过 I/O 流的形式把数据直接存储到文档中。Android中的文件存储分为内部存储和外部存储。

内部存储

指将应用程序中的数据以文件方式存储到设备内部(该文件默认位于data/data/<packagename> 目录下),内部存储方式存储文件被其所创建的应用程序私有,如果其他应用程序要操作本应用程序中的文件,需要设置权限。当创建的应用程序卸载时,其内部存储文件也随之被删除。

内部存储使用的是Context提供的openFileOutput()方法和openFileInput()方法,这两个方法可以分别获取FileOutputStream对象和FileInputStream对象。然后进行读写操作。然后进行读写操作。

        FileOutputStream fos = openFileOutput(String name,int mode);
        FileInputStream fis = openFileInput(String name);

openFileOutput()用于打开应用程序的对应的输出流,将数据存储到指定的文件中。两个参数,name代表文件名,modo代表文件的操作模式。

  • MODE_APPEND:该文件的内容可以追加。
  • MODE_PRIVATE:该文件只能被当前程序读写。
  • MODE_WORLD_READABLE:该文件的内容可以被其他程序读。
  • MODE_WORLD_WRITEABLE:该文件的内容可以被其他程序写。

注意:Android系统有一套自己的安全模型,默认情况下任何应用创建的文件都是私有的,其他程序无法访问。除非在文件中指定了操作模式为MODE_WORLD_READABLE或者MODE_WORLD_WRITEABLE。如果希望外部文件能被其他程序进行读写操作。需要同时指定MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE权限。

外部存储

将文件存储到外部设备上,如SD卡或内嵌入的存储卡,(该文件通常位于mnt/sdcard目录下,不同的厂商生产的手机路径可能会不同)外部存储文件可以被其他应用程序所共享,当外部存储设备连接到计算机时,这些文件可以被浏览,修改和删除因此这种方式不安全。

由于外部设备可能被移除,丢失或处于其他状态,因此在使用外部设备之前必须使用 Environment.getExternal
StorageState()当法来确认外部设备是否可用。当外部设备可用并且具有读写权限时,那么就可以通过FileInputStream、FileOutputStream对象来读写外部设备中的文件。

文件存储工具类示例

package top.codebooks.datastorage;

/**
 * 文件存储工具类
 */

import android.content.Context;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class FileSaveQQ {
    // 保存QQ账号和登录名到data.txt文件中
    public static boolean saveUserInfo(Context context,String number ,String password){

        try {
            FileOutputStream fos = context.openFileOutput("data.txt",
                    Context.MODE_PRIVATE);
            fos.write((number+":"+password).getBytes());
            fos.close();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            e.printStackTrace();
            return false;
        }
    }
    // 从data.txt文件中获取存储的QQ账号和密码
    public static Map<String,String> getUserInfo(Context context){
        String content = "";
        try {
            FileInputStream fis = context.openFileInput("data.txt");
            byte[] buffer = new byte[fis.available()]; // 创建缓冲区并获取文件长度
            fis.read(buffer);
            content = new String(buffer);
            Map<String,String>userMap = new HashMap<String, String>();
            String [] infos = content.split(":");
            userMap.put("number",infos[0]);
            userMap.put("password",infos[1]);
            fis.close();
            return userMap;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
}

二、XML解析

XML文件有三种解析方式,分别是DOM解析,SAX解析和PULL解析。

  • DOM解析

    DOM解析会将文件中的内容以DOM树(文档树)的形式存放在内存中,然后通过DOM API进行遍历、兼做所需的数据,根据树的结构一节点的形式来对树进行操作。支持删除修改等功能。

    值得注意的是。DOM需要先将整个XML文件存放在内存中,消耗内存较大因此较大文件不建议采用这种方法解析。

  • SAX解析

    SAX解析会逐行扫描XNL文件,当遇到标签是出大解析处理器,采用事件处理的方式解析XML文件,再读取得时候可以进行解析处理,因此可解析超大型的文件。SAX解析只能读取XML中的文件,无法进行增、删、改等功能。

  • PULL解析

    PULL解析是一个开源项目,可以用于Android也可用于Java EE项目,Android继承了PULL解析器,在Android中常用的解析方式就是PULL解析。

PULL解析文档,要先创建XmlPullParser解析器该解析器提供了很多属性,通过这些属性可以解析出XML文档的各个节点内容。

三、JSON 解析

  1. JSON数据

    JSON 即Javascript Object Notation(对象表示法),是一种轻量级数据交换格式。

  2. JSON有两种数据结构
    • 对象结构:以 {开始,以}结束,中间部分有0个或多个以分隔的kay:value对构成,注意关键之和值之间以:分隔。

      {
      key1:value1,
      key2:value2,
      ...
      }
      
    • 数组结构:以[ 开始]结束,中间部分由0个或多个以, 分隔的列表组成。

      [
          "name":"zhangsan"
          "key1":{
          key1:value1,
          key2:value2 
          },
      	"hobby":["篮球""羽毛球","游泳"]
      ]
      /***********************************/
      [
          value1,
          value2,
          .....
      ]
      
  3. JSON解析
  • 两种解析方式,1、Android内置的org.json包。2、通过Google开源的Gson库。

    • 例如对一下JSON数据进行解析

      {"name":"zhangsan","age":27,"married":tree}   // json1的一个数据对象
      [16,2,26] 			// Json2的一个数据对象
      
      
    • 使用org.json解析JSON数据

      • 对象结构:使用JSONObject

                JSONObject jsonObject = new JSONObject(json1);
                String name =jsonObject.optString("name");
                int age = jsonObject.optInt("age");
                boolean married = jsonObject.optBoolean("married");
        
      • 数组结构:使用JSONArray

                 JSONArray jsonArray = new JSONArray(json2);
                for (int i = 0; i < jsonArray.length(); i++) {
                    int age = jsonArray.optInt(i);
                }
        

    代码中使用了optlnt()方法,这种方法在解析数据时,如果对应的字段不存在,则会返回空值或则0,不会报错。

  • 使用Gson解析JSON数据

    1. 使用时要先将gson.jar添加到项目中
    2. 要先创建JSON数据对应的实体类Persion,注意:实体类中的成员名称要与JSON数据的key值一致。
    • 对象结构

              Gson gson = new Gson();
              Person person = gson.fromJson(json1,Person.class);
      
    • 数组结构

              Gson gson = new Gson();
              Type listTyoe = new TypeToken<List<WeatherInfo>>(){}.getType();
              List<WeatherInfo> weatherInfos = gson.fromJson(json2,listTyoe);
      

四、SharedPreferences

SharedPreferences是Android上一个轻量级的存储类,主要用于存储一些应用程序的配置参数,如用户名、密码、自定义参数等。他是通过key/value(键值对)的新世将数据保存在XML文件中。SharedPreferences键值对中的值只能是Float、Int、LongBoolean、String、StringSet等数据类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值