安卓数据存储-文件存储的实现

Context类中提供了一个openFileOutput()方法,用于数据存储到指定的文件中。此方法接收两个参数(参数名,操作模式)。首先是参数名,它表示文件创建的时候使用的名称。注意路径不能被改变,路径默认存在 /data/data/<packagename>/file/目录。第二是操作模式,主要有两种模式可以选择:MODE_PRIVATE(默认的操作模式,表示如果指定同样文件名的时候,写入的内容将会覆盖原文件内容)和MODE_APPEND(表示如果该文件存在,就会往文件里面追加内容,不存在就创建新文件).openFileOutput()方法返回的是一个FileOutputStream对象,得到了这个对象之后就可以使用java流的方式将数据写入到文件中。

1)将文本内容保存到文件中

public void save(){

  String data = "Data to save";

  FileOutputStream out = null;

  BufferdWriter writer = null;

  try{

out = openFileOutput("data",Context.MODE_PRIVATE);//得到一个FileOutputStream对象

//构建出BufferedWriter对象

  writer = new BufferedWriter(new OutputStreamWriter(out));

  writer.write(data);//通过BufferedWriter将文本内容

}catch (IOException e){

   e.printStackTrace();

}finally {

   try{

    if(writer != null){

     writer.close();

    }

  }catch(IOException e){

     e.printStackTrace();

  }

}

}

2)文件存储FilePersistenceTest项目

首先修改activity_main.xml中的代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Type something here" />
</LinearLayout>

在布局中加入了一个EditText,用于输入文本内容。当到文本开框输入内容之后,按下返回键,这时候输入内容丢失了。于是我们需要把输入的内容存储到文件当中。修改MainActivity里的代码

public class MainActivity extends AppCompatActivity {
    private EditText editText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = (EditText) findViewById(R.id.editText);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        String inputText = editText.getText().toString();
        save(inputText);
    }
    public void save(String inputText){
        FileOutputStream out = null;
        BufferedWriter writer = null;
        try{
            out = openFileOutput("data", Context.MODE_PRIVATE);
            writer = new BufferedWriter(new OutputStreamWriter(out));
            writer.write(inputText);
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            try{
                if (writer != null){
                    writer.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }
}

这样做仅仅是把EditText输入的文件保存到了文件里,我们下一步要把文件里面的数据读取出来,让下次启动程序的时候让这些数据还原到EditText中

3)从文件中读取数据

2)类似,将数据存储到文件中,Context类还提供了一个openFileInput()方法,用于从文件中读取数据。这个方法只接收一个参数:文件名。然后系统会自动到/data/data/<packagename>/file/目录下去加载这个文件,并返回一个FileInputStream对象,得到了这个对象之后在通过JAVA流的方式就可以将数据读取出来。

读取方法:

public String load(){
    FileInputStream in = null;
    BufferedReader reader = null;
    StringBuilder content = new StringBuilder();
    try{
        in = openFileInput("data");//获取到FileInputStream对象

//构建了一个InputStreamReader对象,再使用InputStreamReader构建出一个BufferedReader对象
        reader = new BufferedReader(new InputStreamReader(in));
        String line = "";
        while ((line = reader.readLine()) != null){
            content.append(line);
        }
    }catch (IOException e){
        e.printStackTrace();
    }
    return content.toString();
}

代码解释:首先通过openFileInput()方法获取到了一个FileInputStream对象,借助它又构建了一个InputStreamReader对象,再使用InputStreamReader构建出一个BufferedReader对象。这样我们就可以通过BuferedReader进行一行行的读取。把文件所有的文本内容全部读取出来,并存放在一个StringBuilder对象中,最后将读取的内容返回就行了。

通过这个文件读取的学习,我们下一步就完善2)的例子,使的重新启动程序时 EditText中能够保留我们上次输入的内容。修改MainActivity中的代码

/**
 * 通过onCreate方法调用load()方法来读取文件中存储的文件内容
 * 如果读取到内容不为null,就调用EditText的setText()方法将内容填充到EditText里,
 * 调用setSelection()方法将输入光标移动到文本的末尾位置以便输入,然后弹出一句还原成功的提示
 * load()方法不懂就看前面
 *
 * @param savedInstanceState
 */

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    editText = (EditText) findViewById(R.id.editText);

//调用load()方法来读取文件中存储的文件内容
    String inputText = load();

//如果读取到内容不为null,就调用EditText的setText()方法将内容填充到EditText里
    if (!TextUtils.isEmpty(inputText)){
        editText.setText(inputText);

//调用setSelection()方法将输入光标移动到文本的末尾位置以便输入,然后弹出一句还原成功的提示
        editText.setSelection(inputText.length());
        Toast.makeText(this, "Restoring succeeded", Toast.LENGTH_SHORT).show();
    }
}

public String load(){

...................//代码见上面的读取方法

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值