【Android入门到项目实战--4.1】—— 数据持久化技术其一:文件存储

目录

序言

文件存储

1、将数据存储到文件中

2、从文件中读取数据


本篇文章主要讲解数据存储中的文件存储。

序言

        什么是数据持久化?就是将那些内存中的瞬时数据保存在存储设备中,当手机关机时,数据仍然不会丢失。Android主要提供了3种方式用于简单地实现数据持久化功能,即文件存储、SharedPreferences存储以及数据库存储。下面将一一讲解这三种方式实现数据持久化。

文件存储

        文件存储是Android中最基本的数据存储方式,适用于存储一些简单的文本数据或二进制数据。

1、将数据存储到文件中

首先建立一个新的项目: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:id="@+id/edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入内容"
        />

    <Button
        android:id="@+id/save"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="保存"
        />

    <Button
        android:id="@+id/load"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="加载"
        />

</LinearLayout>

修改MainActivity.java代码,如下:

        Context类提供了一个openFileOutput()方法,可以将数据存储到指定的文件中,这个方法有两个参数,第一个参数是文件名,注意不可以包含路径;第二个参数是文件的操作模式,MODE_PRIVATE是默认。表示当指定同样文件名的时候,会覆盖原文件内容。

        重写了onDestroy()方法,这样可以保证活动在销毁之前一定调用这个方法,并且在onDestroy()方法里获取EditText输入的内容,并调用save()方法把输入的内容存储到文件中,文件命名为data,而save方法中就是java中写文件的操作。

public class MainActivity extends AppCompatActivity {

    private EditText edit;

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

        save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String inputText = edit.getText().toString();
                save(inputText);
            }
        });


    @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);
            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();
            }
        }
    }

  

}

运行程序,输入一些内容,然后按下保存,这时我们输入的内容就已经保存到文件中了。

2、从文件中读取数据

        Context类中还提供了一个openFileInput()方法,用于从文件读取数据,只接受一个参数,即要读取的文件名。

修改MainActivity.java代码,如下:

        其中,新增了加载按钮的点击事件。

        思路:load()方法用来读取文件中存储的文本内容,如果不为null,则调用EditText的setText()方法将内容填充到EditText里,并调用setSelection()方法将输入光标移动到文本的末尾位置便于继续输入。

        TextUtils.isEmpty()方法可以一次性进行两种空值的判断,当传入的字符串等于null或等于空字符串的时候,返回true。

public class MainActivity extends AppCompatActivity {

    private EditText edit;

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

        save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String inputText = edit.getText().toString();
                save(inputText);
            }
        });

        load.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String inputText = load();
                if (!TextUtils.isEmpty(inputText)) {
                    edit.setText(inputText);
                    edit.setSelection(inputText.length());
                    Toast.makeText(MainActivity.this, "Restoring succeeded", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    @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);
            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();
            }
        }
    }

    public String load() {
        FileInputStream in = null;
        BufferedReader reader = null;
        StringBuilder content = new StringBuilder();
        try {
            in = openFileInput("data");
            reader = new BufferedReader(new InputStreamReader(in));
            String line = "";
            while ((line = reader.readLine()) != null) {
                content.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return content.toString();
    }

}

效果如下:

退出程序,点击加载,即可从文件中读入然后自动输入到输入框中。

至此文本存储已经完成,文本存储不适用用于保存复杂的文本数据,下篇文章将学习比文件存储更简单易用的数据持久化方式。

 


希望本文章对你有帮助,如果你对Android开发感兴趣,请持续关注本专栏,帮助你从入门到项目实战,你将收获:Android基础开发、各种经典功能实现、项目实战、开发自己的APP、将APP上传应用商店、靠广告赚钱等等,持续更新ing......

猜你喜欢

转载自blog.csdn.net/Tir_zhang/article/details/129784121