数据存储——文件存储


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值