Android的数据存储之SharedPreference与文件File

Android的数据存储之SharedPreference与文件File的基本使用

Android的数据存储方式大概分为5种:文件File、网络、SharedPreference、SQLite(数据库)和内容提供者。本节介绍SharedPreference与文件File的基本使用。
1、SharedPreference的基本使用:
sharedPreference是一种轻量级的数据储存方式,使用比较简单。使用比较经典的场景如登录的例子。
(1)、通过getSharedPreferences获取SharedPreferences对象(获取画布)

SharedPreferences sp=context.getSharedPreferences("sharefile.txt",Context.MODE_PRIVATE);

(2)找到画笔:

SharedPreferences.Editor editor = sp.edit();

(3.1)在画布上画,并提交:

//id用于标识内容des
editor.putString(id,des);
//提交,数据被写入文件中
editor.commit();

(3.2)通过id寻找数据:

//找不到数据时默认为null
sp.getString(id,null);

整体代码如下:

package com.example.androidstorgetest;
import android.content.Context;
import android.content.SharedPreferences;
public class sharepreferenceUtils {
    private static sharepreferenceUtils spu;
    private SharedPreferences sp = null;
    private SharedPreferences.Editor editor = null;
    private Context context;
    private String id = "id";
    private sharepreferenceUtils(Context context)
    {
        this.context = context;
        sp=context.getSharedPreferences("sharefile.txt",Context.MODE_PRIVATE);
        editor = sp.edit();
    }
    public static sharepreferenceUtils getInstance(Context context)
    {
        if (spu == null)
            return spu=new sharepreferenceUtils(context);
        else
            return spu;
    }
    public String getData()
    {
        return sp.getString(id,null);
    }
    public void putData(String des)
    {
        editor.putString(id,des);
        editor.commit();
    }
}

这里只列出了一种写数据和读数据的方式,其中写数据还有如下一些方法,可根据需要来使用,
这里写图片描述
2、文件File储存的基本使用
使用文件存储用得较多的是Android提供的openFileInput和openFileOutput两个类,下面通过通过一个例子演示如何使用这两个类。
效果如图,通过按钮先写将“123456789abcdefghijklmn”写入文件再读出来,显示在textview控件上。
这里写图片描述

//包装两个方法来调用
 public String readDataUseBuffer(String filename) throws IOException {
        FileInputStream inputStream = mContext.openFileInput(filename);
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        String  str = "";
        StringBuilder builder = new StringBuilder();
        while ((str = reader.readLine()) != null)
            builder.append(str);
        reader.close();
        inputStream.close();
        return builder.toString();
    }

    public boolean writeDataUseBuffer(String data,String filename) throws IOException {
        FileOutputStream outputStream = mContext.openFileOutput(filename,Context.MODE_PRIVATE);
        BufferedWriter writer =new BufferedWriter(new OutputStreamWriter(outputStream));
        writer.write(data);
        writer.close();
        outputStream.close();
        return true;
    }
//调用方法:fileObject是两个方法的实体类
fileObject.writeDataUseBuffer("123456789abcdefghijklmn","data");
Thread.sleep(1000);
String str = fileObject.readDataUseBuffer("data");
tv.setText(str);

先看写数据进文件,创建一个openFileoutput对象,传入文件名和权限(权限主要有两种:MODE_PRIVATE私有、MODE_APPEND在文件尾追加),再用BufferedWriter来包装这个数据流对象(关于数据流的操作跟Java一样,在后面复习讲),调用write来写入数据。
对读出数据,同样创建一个openFileInput对象,传入文件名和权限,再用BufferReader来包装这个流方便操作。

使用得比较频繁的还有FileInputStream和FileOutStream这两个类,如下,同样通过写成两个方法来操作数据演示如何使用。

  public String ReadData(String filename) throws IOException {
        FileInputStream inputstream = new FileInputStream(filename);
        byte[] data = new byte[1024];
        while (inputstream.read(data) != -1);
        String str = new String(data);
        //关闭流
        inputstream.close();
        /*inputstream.read(data);*/

        /*读取全部值
        * public int read(byte b[])
        *读取时偏移量和长度
        * public int read(byte b[], int off, int len)
        * */
        return str;
    }

    public boolean writeData(String data,String filename) throws IOException {
        File file = new File(filename);
        if (!file.exists())
        {
            file.createNewFile();
            if (!file.exists())
                return false;
        }
        FileOutputStream outputStream = new FileOutputStream(filename);
        outputStream.write(data.getBytes());
        //关闭流
        outputStream.close();
        return true;
   }
   //调用方法来写数据
   if(!fileObject.writeData("1234567890abcdefghijklmnopqrstuvwz",getFilesDir().getPath()+"/file.txt")){
    Log.e("tag","file not found");
    return;
 }
 Thread.sleep(1000);
 String readData=fileObject.ReadData(getFilesDir().getPath()+"/file.txt");
 tv.setText(readData);

这里没有包装流,直接操作。需要注意的是,这两个类不会自动创建文件,如果文件没有需要先判断文件是否存在再操作文件。
判断文件是否存在和创建一个文件可调用如下两个方法:
File file = new File(filename);
if (!file.exists())
{
file.createNewFile();
}

除了上面使得比较频繁的类,在加载Android资源常常会用到下面的方法:

//获取Assets资源
InputStream in = mContext.getResources().getAssets().open(fileName);
//获取raw资源
InputStream in = getResources().openRawResource(R.raw.read_raw); 

文件路径问题:
* 方法:getDataDirectory()返回 File ,获取 Android 数据目录。
* 方法:getDownloadCacheDirectory()返回 File ,获取 Android 下载/缓存内容目录。
* 方法:getExternalStorageDirectory()返回 File ,获取外部存储目录即 SDCard
* 方法:getExternalStoragePublicDirectory(String type)返回 File取一个高端的公用的外部存储器目录来摆放某些类型的文件
* 方法:getExternalStorageState()返回 File ,获取外部存储设备的当前状态
* 方法:getRootDirectory()返回 File ,获取 Android 的根目录
*方法Context.getFilesDir(),返回/data/data/PackageName/files的File对象。
*方法Context.getCacheDir()返回/data/data/PackageName/cache的File对象。

补充:复习Java流
Android的流程操作跟Java一样,这里补充总结一下Java流操作。
Java的io流可分为:
(1)、输入流和输出流 (从CPU的角度去考虑问题) (2)、字节流和字符流 byte(8位) char(16位)
根据上面的分类的结合,Java IO流主要分为4大类:
字节输入流:抽象基类是InputStream
字节输出流:抽象基类是OutputStream
字符输入流:抽象基类是Reader
字符输出流:抽象基类是Writer
实体使用:
向文件输入输出,则使用如下的类:FileInputStream、FileOutputStream、FileReader、FileWriter
向数组输入输出:ByteArrayInputStream、ByteArrayOutputStream、CharArrayReader、CharArrayWriter
向管道输入输出:PipedInputStream、PipedOutputStream、PipedReader、PipedWriter
字符串:StringReader、StringWriter
缓冲区:BufferedInputStream、BuferedOutputStream、BuferedReader、BufferedWriter
转换流:
InputStreamReader 字节输入流转字符输入流
OutputStreamWriter 字节输出流转字符输出流
对象流(对象序列化):
ObjectInputStream 对象输入流
ObjectOutputStream 对象输出流
有时需要对一个流进行包装,例如上面文件操作BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));是对inputStream流进行包装,使得流的效率更高,更加方便数据操作。
几种流的关系如下图:
这里写图片描述
包装流的原理如下图:
这里写图片描述
关于流的操作比较灵活,视需要运用即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值