数据存储——文件存储

来源:互联网 发布:erp是什么软件 编辑:程序博客网 时间:2024/06/07 03:20


Android 系统中主要提供了三种方式用于简单地实现数据持久化功能,即文件存储、SharedPreference 存储以及数据库存储。
还可以将数据保存在手机的SD 卡中,不过使用以上三种方式来保存数据会更简单一些,而且会更加的安全。

文件存储

存储数据到文件中

最基本的一种数据存储方式,它不对存储的内容进行任何的格式化处理,所有数据都是原封不动地保存到文件中的,因而比较适合用于存储一些简单的文本数据或二进制数据。

Context类的openFileOutput (String name, int mode)用于将数据存储到指定的文件中。
name为文件名(不包含路径),所有的文件都是默认存储到/data/data/<package name>/files/ 目录下。
mode为文件的操作模式,MODE_PRIVATE是默认的操作模式,表示当指定同样文件名的时候,所写入的内容将会覆盖原文件中的内容;
MODE_APPEND 则表示如果该文件已存在就往文件里面追加内容,不存在就创建新文件。MODE_WORLD_READABLE 和MODE_WORLD_WRITEABLE危险,被弃用。

openFileOutput ()方法返回的是一个FileOutputStream 对象,得到了这个对象之后,可以使用Java 流的方式将数据写入到文件中。

以下是一段简单的代码示例,展示了如何将一段文本内容保存到文件中:

//通过openFileOutput()方法得到一个FileOutputStream对象,然后再借助它构建出一个OutputStreamWriter对象,接着再使用OutputStreamWriter构建出一个BufferedWriter对象,这样就可以通过BufferedWriter来将文本内容写入到文件中了。 public void save() {    String data = "这是一个数据";    FileOutputStream out;    OutputStreamWriter osw;    BufferedWriter writer = null;    try {        out = openFileOutput("文件名.txt", Context.MODE_PRIVATE);      //得到一个FileOutputStream对象out        osw = new OutputStreamWriter(out);    //构建出一个OutputStreamWriter对象osw        writer = new BufferedWriter(osw);    //构建出一个BufferedWriter对象writer        writer.write(data);        //通过BufferedWriter的write()方法将文本内容写入到文件中    } catch (IOException e) {        e.printStackTrace();    } finally {        try {            if (bw != null) {    //此处,所以bw必须初始化赋值                bw.close();            }        } catch (IOException e) {            e.printStackTrace();        }    }}

例子A:

布局中仅仅一个EditText。

在文本输入框中随意输入点什么内容,再按下Back 键,这时输入的内容就已经丢失了,因为它只是瞬时数据,在活动被销毁后就会被回收。而以下程序,就是在数据被回收之前,将它存储到文件当中。

以下文件中的"文件名.txt"存储在/data/data/com.example.a/files/目录下

public class MainActivity extends AppCompatActivity {    @BindView(R.id.et_edit)    EditText etEdit;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ButterKnife.bind(this);    }    @Override    protected void onDestroy() {        super.onDestroy();        String text = etEdit.getText().toString();        save(text); //保证在活动销毁之前一定会调用这个方法    }    private void save(String text) {        FileOutputStream out;        BufferedWriter writer = null;        OutputStreamWriter osw;        try {            out = openFileOutput("文件名.txt", MODE_APPEND);            osw = new OutputStreamWriter(out);            writer = new BufferedWriter(osw);            writer.write(text);        } catch (IOException e) {            e.printStackTrace();        } finally {            try {                if (writer != null) {                    writer.close();                }            } catch (IOException e) {                e.printStackTrace();            }        }    }}

从文件中读取数据

Context类的openFileInput(String name)方法。

系统会自动到/data/data/<package name>/files/目录下去加载这个文件,并返回一个FileInputStream 对象,再通过Java 流读取数据。

public String load() {    FileInputStream in;    BufferedReader reader = null;    StringBuilder content = new StringBuilder();    try {        in = openFileInput("文件名.txt");        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();}

例子A是在文本框输入数据,然后退出程序时会保存数据,在A的代码下,加入以下代码,让再次进入程序的时候,刚刚输入的文本还能在文本编辑框显示

1.在onCreate()下添加

load();etEdit.setText(content.toString());

2.加入读取方法load()

StringBuilder content;public String load() {    FileInputStream in;    BufferedReader reader = null;    content = new StringBuilder();    try {        in = openFileInput("文件名.txt");        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();}


0 0
原创粉丝点击