浅谈Android的三种数据持久化技术之文件存储

/我挥舞着键盘和本子,发誓要把世界写个明明白白/

安卓提供了三种数据持久化技术,分别为:文件存储、SharedPreference、数据库存储。

一,文件存储
1)文件存储是Android中最基本的一种数据存储方式,它不对存储的内容进行任何的格式化处理,所有数据都是原封不动地保存到文件当中的,因而它比较适合用于存储一些简单的文本数据或二进制数据。
2)Context类中提供了一个openFileOutput()方法,可以用于将数据存储到指定的文件中。这个方法接收2个参数,第一个参数是文件名,所有文件都是默认存储到/data/data//files/;第二个参数是文件的操作模式,有两种模式可选,MODE_PRIVATE(表示指定同样文件名的时候,所写入的内容将会覆盖原文件的内容)和MODE_APPEND(表示如果该文件已存在就往文件里面追加内容,不存在就创建新文件)。openFileOutput()方法返回的是一个FileOutputStream对象,得到这个对象后就可以使用JAVA流的方式将数据写入到文件中了。
3)Context类中还提供了一个openFileInput()方法,用于从文件中读取数据。它接收一个参数,即要读取的文件名,然后系统会自动到/data/data//files/目录下去加载这个文件,并返回一个FileInputStream对象,得到了这个对象之后再通过JAVA流的方式将数据读取出来。

下面就编写一个完整的例子,首先创建一个FilePersistenceTest项目,修改activity_main 代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <EditText
        android:id="@+id/edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Type something here" />

</LinearLayout>

这里只是简单的添加一个EditText,用于输入文本内容。运行一下程序,界面上肯定有一个文本输入框,然后在文本输入框中随意输入点什么内容,再按下Back键,这时输入的内容肯定就已经丢失了,因为它只是瞬时数据,在活动被销毁后就会被回收。而我们想做的,就是在数据被回收之前,将它存储到文件当中。然后再从文件中读取保存的数据,使得重新启动程序时EditText中能够保留我们上次输入的内容。修改MainActivity中的代码,如下:

package com.example.filepersistencetest;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {
private EditText edit;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);  //加载布局文件
         edit=(EditText) findViewById(R.id.edit);  //文本输入框实例化
         String inputText=load();   //调用读取函数load(),读取文件中存储的文本内容
         if(!TextUtils.isEmpty(inputText)){   //如果读到的内容不为空
             edit.setText(inputText);      //将内容填充带EditText里
             edit.setSelection(inputText.length()); //调用setSelection()将输入光标移到到文本的末尾以便继续输入
             Toast.makeText(this,"Restoring succeeded",Toast.LENGTH_SHORT).show(); //调用Toast.makeText()方法,弹出还原成功的提示。
         }
    }
@Override
protected void onDestroy(){
    super.onDestroy();
    String inputText=edit.getText().toString();
    save(inputText);
}
    public void save(String inputText){
        FileOutputStream out=null;         
        BufferedWriter writer=null;
        try{
            out=openFileOutput("data",Context.MODE_PRIVATE);   //通过openFileOutput()方法得到FileOutputStream对象
            writer=new BufferedWriter(new OutputStreamWriter(out));  //借助out,再构建一个OutputStreamWriter对象,接着再使用OutputStreamWriter构建出一个BufferedWriter对象
            writer.write(inputText); 调用BufferedWriter的write()方法进行写数据;
        }
        catch (IOException e){
            e.printStackTrace();
        }
        finally {
            try{
                if(writer!=null){
                    writer.close();
                }
            }
            catch (IOException e){
                e.printStackTrace();
            }
        }
    }

    public String load(){
        FileInputStream in=null;
        BufferedReader reader=null;
        StringBuilder content=new StringBuilder();
        try{
            in=openFileInput("data"); //通过openFileInput()方法获取一个FileInputStream对象
            reader=new BufferedReader (new InputStreamReader(in)); //借助in,构建出一个InputStreamReader对象,接着使用InputStreamReader构建出一个BufferedReader对象
            String line="";     
            while((line=reader.readLine())!=null){   //调用reader的readLine()方法,可以读取文件数据一行的内容,当读取的内容不为空,就把那行的数据添加到content里。
                content.append(line);       
            }
        }
        catch (IOException e){
            e.printStackTrace();
        } finally{
            if (reader!=null){    数据读取完毕,关闭输出源。
                try{
                    reader.close();
                }
                catch(IOException e){
                    e.printStackTrace();
                }
            }
        }
        return content.toString(); //文件读取的内容全部存放在一个StringBuilder对象中,最后将读取到的内容返回。
    }

}

现在重新运行一下程序,在EditText中输入 You are a good boy ,接着按下Back键退出程序,再重新启动程序,这时刚才输入的内容并不会丢失,而是还原到了EditText中,如图1。你也可以借助DDMS的File Explorer来查看是否我们输入的内容保存到指定的文件中了。切换到DDMS视图,并点击File Explorer切换卡,在这里进入/data/data/com.example.filepersistencetest/files/目录下,可以看到生成了一个data文件,如图2。点击图3最左边的按钮可以将这个文件导出到电脑上。使用记事本打开这个文件,里面内容如图4所示。
这里写图片描述
图1
这里写图片描述
图2
这里写图片描述
图3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值