在平常使用Android手机的时候,我们都知道,几乎每一个app都在/data/data/<相应的包名>的文件夹下保存数据。那这些数据怎么进行保存的呢?在这里,将简单的介绍一下。
1.将数据保存在文件中
Context类中有一个openFileOutPut方法,这个方法可以将我们的数据保存在data目录下的文件里面。
openFileOutput(String name, int mode)方法中带两个参数,第一个参数是文件名,这里只能写文件的名字,不能包含路径,因为所有的数据都保存在/data/data/<应用包名>/files/目录下;第二个参数是文件的操作模式,有MDOE_PRIVATE,MODE_APPEND,MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE。
其中MODE_PRIVATE模式的是默认的操作模式,每一次写入的内容时,都会覆盖前面的内容;MODE_APPEND模式表示的是每次写入的内容追加在前面的后面;MODE_WORLD_READABLE表示的是其他应用程序可以对该文件进行写的操作;MODE_WORLD_WRITEABLE表示的是其他应用程序可以对该文件进行读的操作。不过在后面的两种模式过于危险,google已经在Android 4.2中废弃了。
openFileOutput()方法返回的是一个FileOutPutStream的对象,得到了这个对象,就可以使用Java的IO流来对文件的使用了。
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button mButton = null;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = (Button) findViewById(R.id.id_button);
mButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
BufferedWriter bw = null;
FileOutputStream fos = null;
try {
String string = "pby 的数据";
fos = openFileOutput("pby", MODE_PRIVATE);
bw = new BufferedWriter(new OutputStreamWriter(fos));
bw.write(string);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bw != null) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<Button
android:id="@+id/id_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="保存" />
</LinearLayout>
点击保存过后,就会把我们的数据保存在data目录下。
如果我们想要查看的话,就可以在Android studio(我是2.3.2的版本)中找到Tools->Android->Android Device Monitor
再打开/data/data/<应用包名>/files/,发现有一个文件,就是我们之前创建的一个文件。
我们可以点击右上角的图标进行相应的导出工作,对相应的文件进行导出操作。
注:
如果打开/data/文件夹是一个空的话,表示模拟器没有root,必须获得root权限。具体的操作会在后续的文章中介绍,链接:http://www.jianshu.com/p/24e6493a5ef9。
2.从文件中读取数据
在Context类中,与openFileOutput方法对应的是openFileInput方法,用户从data目录读取相应的数据。这个方法相较于openFileOutput方法简单一些。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<Button
android:id="@+id/id_save"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="保存" />
<Button
android:id="@+id/id_load"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="加载" />
<TextView
android:id="@+id/id_textView"
android:textSize="30sp"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="100dp" />
</LinearLayout>
package com.example.android_demo;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button mButtonSave = null;
private Button mButtonLoad = null;
private TextView mTextView = null;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButtonSave = (Button) findViewById(R.id.id_save);
mButtonSave.setOnClickListener(this);
mButtonLoad = (Button) findViewById(R.id.id_load);
mButtonLoad.setOnClickListener(this);
mTextView = (TextView) findViewById(R.id.id_textView);
}
@Override
public void onClick(View v) {
switch (v.getId())
{
case R.id.id_save:
{
save();
break;
}
case R.id.id_load:
{
load();
break;
}
}
}
private void save()
{
BufferedWriter bw = null;
FileOutputStream fos = null;
try {
String string = "pby 的数据";
fos = openFileOutput("pby", MODE_PRIVATE);
bw = new BufferedWriter(new OutputStreamWriter(fos));
bw.write(string);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bw != null) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private void load()
{
BufferedReader br = null;
FileInputStream fis = null;
try
{
String content = null;
fis = openFileInput("pby");
br = new BufferedReader(new InputStreamReader(fis));
content = br.readLine();
mTextView.setText(content);
}catch(FileNotFoundException e)
{
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally{
if(br != null)
{
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fis != null)
{
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
效果示意图: