数据持久化就是指将那些内存中的瞬时数据保存到持久化设备中(如手机文件、数据库等),当关机,停电后,数据不丢失。
Android 系统中主要提供了三种方式用于实现数据持久化功能,分别是:
1、文件存储
2、SharedPreference 存储
3、数据库存储。
今天我们学习第一种存储方式:文件存储。
使用范围:文件储存适合用于存储一些简单的文本数据或二进制数据。
没有理论,直接上代码:
效果图如下:
activity_main.xml 中的代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<EditText
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="输入内容" />
<Button
android:id="@+id/saveInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="保存信息" />
<Button
android:id="@+id/loadInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取保存的信息" />
</LinearLayout>
MainActivity 中的代码:
package com.demo.filepersistencedemo;
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.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
private EditText edit;
private Button save;
private Button loadInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit = (EditText) findViewById(R.id.edit);
save = (Button) findViewById(R.id.saveInfo);
loadInfo = (Button) findViewById(R.id.loadInfo);
save.setOnClickListener(this);
loadInfo.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.saveInfo:
// 获得edit中输入的值
String inputText = edit.getText().toString();
// 将输入框中的值存入file文件中
save(inputText);
edit.setText("");//清空刚刚输入的信息
break;
case R.id.loadInfo:
String str = load();
if (!TextUtils.isEmpty(str)) {
edit.setText(str);
edit.setSelection(str.length());
Toast.makeText(this, "信息获取成功", Toast.LENGTH_SHORT)
.show();
}
break;
default:
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
// 活动销毁之前,获得edit中输入的值
String inputText = edit.getText().toString();
// 将输入框中的值存入file文件中
save(inputText);
}
/**
* @param inputText
* 将输入框中值保存到文件中 保存方式:文件存储
*/
public void save(String inputText) {
FileOutputStream out = null;
BufferedWriter writer = null;
try {
/**
* Context类中提供了openFileOutput(String name, int
* mode)方法,实现将数据存储到指定的文件中的功能。 该方法中有两个参数,分别是:
* 1、第一个参数name是文件名,这个文件名不可以包含路径, 因为所有的文件都是默认存储到/data/data/<package
* name>/files/ 目 录下 的 2、第 二 个 参数 mode是 文件 的 操作 模 式 ,主 要 有两 种 模式 可
* 选: a、MODE_PRIVATE:默认操作模式,文件名相同时,写入的新内容会覆盖原有内容,不存在就创建新文件。
* b、MODE_APPEND:文件名相同时,写入的新内容追加到原有内容后面,不存在就创建新文件。
*/
out = openFileOutput("data", Context.MODE_APPEND);// 这里使用追加的方式
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();
}
}
}
/**
* @return 保存到文件中的字符串 获得保存到文件中的字符串信息
*/
public String load() {
FileInputStream in = null;
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
try {
/**
* Context类中提供了一个 openFileInput(String name)方法,用于从文 件中读取数据。
* 它只接收一个参数:要读取的文件名,
* 然后系统会自动到/data/data/<package name>/files/目录下去加载这个文件, 并返回一个
* FileInputStream 对象,得到了这个对象之后再通过 Java 流的方式就可以将数据读取出来了
*/
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();
}
}
下载项目:
eclipse中查看file保存的位置,如图:
导入到电脑上的值,如图: