Android :数据存储方案学习笔记之 文件存储(openFileOutputopenFileInput)

Posted JMW1407

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android :数据存储方案学习笔记之 文件存储(openFileOutputopenFileInput)相关的知识,希望对你有一定的参考价值。

文件存储

一、要实现的功能

将输入框中的数据保存到指定文件名的文件中,实现数据的持久化;如果数据已经保存了,活动下次再启动的时候,就将保存在文件中的数据读取出来,显示在输入框中。

二、基本知识

  • 1、利用活动生命周期中的一个回调函数onDestroy(),在活动被销毁之前,将数据写入到文件当中。例如按下返回键的时候,活动就被销毁,这个方法里面的代码就会被执行。
  • 2、利用TextUtils中的isEmpty(CharSequence str)方法可以轻松地判断一个字符串变量是不是null,以及这个字符串是不是空字符串(字符串长度为0)。java中传统的方式是这么写的:
    if(string!=null&&string.length()!=0) ,这种方式比较麻烦,用TextUtils的话就比较方便了。

3、① 利用Contex类中的openFileOutput(String name, int mode)方法可以获取一个FileOutputStream对象,这个方法第一个参数传入的是文件名,第二个参数是文件的操作模式,取值主要有MODE_PRIVATEMODE_APPEND,如果文件已经存在了,第一种方式会把文件中原来的内容覆盖掉,第二种方式则是在原来的基础上进行追加数据。

②利用Contex类中的openFileInput(String name)可以获取一个FileInputStream对象,方法中传入的参数是文件的名称。

除此之外,文件的读写操作就没有什么特殊的了,用到的都是JDK中的IO知识,这里还用到了缓冲字符流,主要是为了提高读取、写入的速度。

三、使用

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.EditText;
import android.widget.Toast;
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;

public class MainActivity extends AppCompatActivity
{
    private EditText et;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et=findViewById(R.id.et);
        String load = load();
        if (!TextUtils.isEmpty(load))//如果文件存在
        {
            et.setText(load);
            et.setSelection(load.length());//将光标移动到输入框的末尾
            Toast.makeText(this,"从文件中恢复数据成功!",Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    protected void onDestroy()//活动被销毁之前,将数据保存到文件中
    {
        super.onDestroy();
        String string = et.getText().toString();
        save(string);
    }

    /**
     * 将文本数据写入到文件中
     * @param inputText
     */
    private void save(String inputText)
    {
        FileOutputStream fileOutputStream=null;
        BufferedWriter bufferedWriter=null;
        try
        {
            fileOutputStream=openFileOutput("info.txt",MODE_PRIVATE);
            bufferedWriter=new BufferedWriter(new OutputStreamWriter(fileOutputStream));
            bufferedWriter.write(inputText);
        } catch (Exception e)
        {
            System.out.println(e);
        }
        finally
        {
            if (bufferedWriter!=null)
            {
                try
                {
                    bufferedWriter.close();
                } catch (IOException e)
                {
                    System.out.println(e);
                }
            }

        }
    }


    /**
     * 从文件中读取数据
     * @return
     */
    private String load()
    {
        FileInputStream fileInputStream=null;
        BufferedReader bufferedReader=null;
        StringBuilder stringBuilder=new StringBuilder();
        try
        {
            fileInputStream= openFileInput("info.txt");
            bufferedReader=new BufferedReader(new InputStreamReader(fileInputStream));
            String line="";
            while ((line=bufferedReader.readLine())!=null)
            {
                stringBuilder.append(line);
            }
        } catch (Exception e)
        {
            System.out.println(e);
        }
        finally
        {
            if (bufferedReader!=null)
            {
                try
                {
                    bufferedReader.close();
                } catch (IOException e)
                {
                    System.out.println(e);
                }
            }
        }
        return stringBuilder.toString();
    }
}


要注意的地方:

  • Context.openFileOutput这个函数的第一个参数的意思是文件名,不能添加路径,因为文件默认存储到/data/data/包名/flies目录下
  • onCreate里有几个方法需要注意:TextUtil.isEmpty(string)这种方法会把字符串为null和空值都判断为true,从而避免了需要分开考虑这两种问题的麻烦。然后setSelection函数的作用是设置EditText的光标的位置。

布局代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

   <EditText
       android:id="@+id/et"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:gravity="center"
       android:hint="请输入您要保存的信息"/>

以下是两张在模拟器中的效果截图。

输入要保存的文字信息:

文件保存以后,下次再打开程序:

参考

以上是关于Android :数据存储方案学习笔记之 文件存储(openFileOutputopenFileInput)的主要内容,如果未能解决你的问题,请参考以下文章

Android :数据存储方案学习笔记之 SharedPreferences

Android学习——数据存储之文件存储

android学习笔记46——File存储

Android:日常学习笔记———探究持久化技术

NodeJS学习笔记之MongoDB模块

day04关于MySqL—Android小白的学习笔记