Android中的数据持久化技术。
Android系统中主要提供了3种方式用于简单地实现数据持久化功能,
文件存储
SharedPreferences存储
数据库存储
1.文件存储
Contex
t类中提供了一个openFileOutput
()方法,可以用于将数据存储到指定的文件中。
这个方法接收两个参数,
- 第一个参数是文件名,在文件创建的时候使用的就是这个名称,注意这里指定的文件名不可以包含路径,
因为所有的文件都是默认存储到/data/data/<package name>/files/
目录下的。 - 第二个参数是文件的操作模式,主要有两种模式可选,MODE_PRIVATE和MODE_APPEND。
其中MODE_PRIVATE
是默认的操作模式,表示当指定同样文件名的时候,所写入的内容将会覆盖原文件中的内容,
而MODE_APPEND
则表示如果该文件已存在,就往文件里面追加内容,不存在就创建新文件。
其实文件的操作模式本来还有另外两种:`MODE_WORLD_READABLE`和`MODE_WORLD_WRITEABLE`,这两种模式表示允许其他的应用程序对我们程序中的文件进行读写操作,
不过由于这两种模式过于危险,很容易引起应用的安全性漏洞,已在Android 4.2版本中被废弃
openFileOutput ()
方法返回的是一个FileOutputStream
对象,得到了这个对象之后就可以使用Java流的方式将数据写入到文件中了。以下是一段简单的代码示例,展示了如何将一段文本内容保存到文件中:
新建项目 FilePersistenceDemo
1.1 写文件
- activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
tools:context=".MainActivity">
<EditText android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入..."/>
</androidx.constraintlayout.widget.ConstraintLayout>
-
MainActivity
public class MainActivity extends AppCompatActivity { private EditText editText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = findViewById(R.id.edit_text); } @Override protected void onDestroy() { super.onDestroy(); String text = editText.getText().toString(); saveToFile(text); // 按Back键,关闭程序,保存文本到文件 } private void saveToFile(String inputText){ FileOutputStream fos =null; BufferedWriter writer = null; try { fos = openFileOutput("myFile", Context.MODE_PRIVATE); writer = new BufferedWriter(new OutputStreamWriter(fos)); writer.write(inputText); }catch (IOException e){ e.printStackTrace(); }finally { try { if (null != writer){ writer.close(); } }catch (Exception e){ e.printStackTrace(); } } } }
在模拟器中运行 程序,在文本框中输入 Hello Wrod!
在模拟器中(这里使用的是:夜神模拟器,打开系统文件夹,提示要开启root权限)
【夜神模拟器】开启root权限
打开系统文件夹:/data/data/com.example.filepersistencetest/files/
,可以看到生成了一个myFile
文件,
1.2 读文件
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = findViewById(R.id.edit_text);
String text = loadTextFromFile();
if (!TextUtils.isEmpty(text)){ //Returns true if the string is null or 0-length.
editText.setText(text);
editText.setSelection(text.length()); //setSelection()方法将输入光标移动到文本的末尾位置以便于继续输入,
Toast.makeText(MainActivity.this,"从文件加载文本成功:"+ text, Toast.LENGTH_LONG).show();
}
}
...
private String loadTextFromFile(){
FileInputStream fis = null;
BufferedReader reader = null;
StringBuilder context = new StringBuilder();
try {
fis = openFileInput("myFile");
reader = new BufferedReader(new InputStreamReader(fis));
String line = "";
while ((line = reader.readLine()) != null ){
context.append(line);
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
if (null != reader){
reader.close();
}
}catch (Exception e){
e.printStackTrace();
//如果myFile不存在会发生异常
Toast.makeText(MainActivity.this,"读取文件myFile出现异常", Toast.LENGTH_LONG).show();
}
}
return context.toString();
}
-
openFileInput("myFile");
打开文件 - 注意: 如果文件myFile不存在会发生异常。