第六章 数据存储

6.1 持久化技术

持久化技术指将内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失。

主要有三种方式用于简单地实现数据持久化功能:文件存储、SharedPreferences存储以及数据库存储。

6.2 文件存储

android中最基础的一种数据存储方式,不对存储内容做任何格式化处理,比较适合存储一些简单的文本数据或二进制数据。

6.2.1 将数据存储到文件中

创建一个新项目FilePersistenceTest

a.修改activity_main中的代码,加入一个EditText

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"> <EditText
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Type Something Here"/>
</LinearLayout>

b.修改MainActivity.java中的代码

openFileOutput()方法可以用于将数据存储到指定文件中,接收两个参数,第一个为文件名,不包含路径,第二个为文件的操作模式,MODE_PRIVATE和MODE_APPEND。该方法返回一个FIleOutputStream对象。再借助它构建出一个OutputStreamWriter对象,接着再用OutputStreamWriter构建出一个BufferedWriter对象,然后通过BufferedWriter来将文本内容写入文件。

 out = openFileOutput("data", Context.MODE_PRIVATE);
writer = new BufferedWriter(new
OutputStreamWriter(out));
writer.write(input);

在onDestroy()方法中加入save方法,保证在数据被回收之前,将它存储到文件当中。

 private EditText edit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit = (EditText) findViewById(R.id.edit);
}
    @Override
protected void onDestroy() {
super.onDestroy();
String inputText = edit.getText().toString();
save(inputText);

} public void save(String input){
FileOutputStream out = null;
BufferedWriter writer = null;
try{
out = openFileOutput("data", Context.MODE_PRIVATE);
writer = new BufferedWriter(new
OutputStreamWriter(out));
writer.write(input);

}catch(IOException e){
e.printStackTrace();
}finally{
try {
if (writer != null) {
writer.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
}

运行程序:

输入之后,通过Tools——>Android———>Android Device Monitor

在File Explorer标签页中找到/data/data/com.example.song.filepersistencetest/file/目录,将data文件导出

用记事本打开该文件即可看到内容。

6.2.2 从文件中读取数据

修改MainActivity中的方法

通过openFileInput()方法获得一个FileInputStream对象,然后借助它构建出一个InputSteamReadder对象,接着再使用InputStreamReader构建出一个BufferedReader对象,通过BufferedReader进行一行行地读取,把文件中的所有内容读取出来,并存放在StringBuilder对象中,最后返回读取的对象。

注意的方法:

1.reader.readLine() 读取文件中的一行字符串

2.TextUtils.isEmpty()方法可以一次性对两种空值进行判断,当传入的字符串等于null或者等于空字符串时,这个方法都会返回true

3..setSelection()方法将输入光标移动到文本的末尾位置以便继续输入。

public class MainActivity extends AppCompatActivity {
private EditText edit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit = (EditText) findViewById(R.id.edit); String inputText = load();
if(!TextUtils.isEmpty(inputText)){
edit.setText(inputText);
edit.setSelection(inputText.length());
Toast.makeText(this, "Restoring succeeded"
, Toast.LENGTH_SHORT).show();
}

}
  public String load() {
StringBuilder builder = new StringBuilder();
FileInputStream in = null;
BufferedReader reader = null;
try {
in = openFileInput("data");
reader = new BufferedReader(new
InputStreamReader(in));
String line = "";
while ((line = reader.readLine()) != null) {
builder.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return builder.toString();
}
}

运行程序:

总结:

存储文件和读取文件的核心:

存储数据到文件文件:

用openFileOutput()方法创建FileOutputStream对象,再借助它构建出一个OutputStreamWriter对象,接着再用OutputStreamWriter构建出一个BufferedWriter对象,然后通过BufferedWriter来将文本内容写入文件。

 out = openFileOutput("data", Context.MODE_PRIVATE);
writer = new BufferedWriter(new
OutputStreamWriter(out));
writer.write(input);

从文件中读取数据:

通过openFileInput()方法获得一个FileInputStream对象,然后借助它构建出一个InputSteamReadder对象,接着再使用InputStreamReader构建出一个BufferedReader对象,通过BufferedReader进行一行行地读取,把文件中的所有内容读取出来,并存放在StringBuilder对象中,最后返回读取的对象。

in = openFileInput("data");
reader = new BufferedReader(new
InputStreamReader(in));


<Android基础> (六) 数据存储 Part 1 文件存储方式的更多相关文章

  1. <Android基础> (六) 数据存储 Part 2 SharedPreferences方式

    6.3 SharedPreferences存储 SharedPreferences使用键值对的方式来存储数据.同时支持多种不同的数据类型. 6.3.1 将数据存储到SharedPreferences中 ...

  2. <Android基础> (六) 数据存储 Part 3 SQLite数据库存储

    6.4 SQLite数据库存储 SQLite是一种轻量级的关系型数据库,运算速度快,占用资源少. 6.4.1 创建数据库 Android为了管理数据库,专门提供了SQLiteOpenHelper帮助类 ...

  3. Android数据存储之Android 6.0运行时权限下文件存储的思考

    前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以 ...

  4. android基础---->JSON数据的解析

    上篇博客,我们谈到了XML两种常用的解析技术,详细可以参见我的博客(android基础---->XMl数据的解析).网络传输另外一种数据格式JSON就是我们今天要讲的,它是比XML体积更小的数据 ...

  5. android基础---->XMl数据的解析

    在网络上传输数据时最常用的格式有两种,XML和JSON,下面首先学一下如何解析XML格式的数据,JSON的解析可以参见我的博客(android基础---->JSON数据的解析).解析XML 格式 ...

  6. Linux基础篇学习——Linux文件系统之文件存储与读取:inode,block,superblock

    Linux文件类型 代表符号 含义 - 常规文件,即file d directory,目录文件 b block device,块设备文件,支持以"block"为单位进行随机访问 c ...

  7. 4、Android-数据存储方案(文件存储/SharedPreferences)

    简介: 任何一个应用程序都需要和数据进行交互 对于软件来说微博.QQ等都需要关系的是数据 没有数据的应用程序是一个没有灵魂的软件 而且还没有实际的用途 可以认为是单机 4.1.持久化技术的简介 数据持 ...

  8. Android开发--数据存储之File文件存储

    转载来自:http://blog.csdn.net/ahuier/article/details/10364757,并进行扩充 引言:Android开发中的数据存储方式 Android提供了5种方式存 ...

  9. android基础知识13:AndroidManifest.xml文件解析

    注:本文转载于:http://blog.csdn.net/xianming01/article/details/7526987 AndroidManifest.xml文件解析. 1.重要性 Andro ...

随机推荐

  1. 你真的懂JavaScript基础类型吗

    夯实Javascript基础. 基本类型有六种: null,undefined,boolean,number,string,symbol. 基本类型的值是保存在栈内存中的简单数据段 基础类型特性 基础 ...

  2. ButterKnife 牛油刀使用

    一.butterknife介绍 ①官网 butterknife ②Field and method binding for Android Views which uses annotation pr ...

  3. ORA-02266错误的批量生成脚本解决方案

    ORA-02266: unique/primary keys in table referenced by enabled foreign keys这篇博客是很早之前总结的一篇文章,最近导数时使用TR ...

  4. Python进阶教程001内置数据类型

    关于Python的基础知识已经告一段落了,我们接下来深入的研究Python的使用方法,以及以后将要使用到的类库. 格式化字符串 Python是支持字符串的格式化输出的,在之前的学习中我们也遇到过和使用 ...

  5. Go语言打造以太坊智能合约测试框架(level1)

    传送门: 柏链项目学院 Go语言打造以太坊智能合约测试框架 前言 这是什么? 这是一个基于go语言编写的,自动化测试以太坊智能合约的开发框架,使用此框架,可以自动化的部署合约,自动测试合约内的功能函数 ...

  6. win10怎么进入和退出安全模式?

    在Win10系统里同时按下”Win+R“组合按键,在打开的运行对话框里输入命令:msconfig,然后点击确定,如下图所示. 点击打开系统配置窗口,选择引导选项卡,如下图所示. 在引导选项卡窗口下,将 ...

  7. firewalld防火墙设置

    CentOS7/RHEL7系统默认的iptables管理工具是firewalld,不再是以往的iptables-services,命令用起来也是不一样了,当然你也可以选择卸载firewalld,安装i ...

  8. Python之Scripy框架

    为什么要用到cmd界面 --- 在这里操作的是Scripy框架的指令,不是Python代码 Parse --- Scripy的回调函数 fiddler --- 用于爬取JS存储数据的页面 项目: 1. ...

  9. Python基础之注释,算数运算符,变量,输入和格式化输出

    Python的注释 注释的作用:用自己熟悉的语言,对某些代码进行标注说明,增强程序的可读性: 在python解释器解释代码的过程中,凡是#右边的,解释器都直接跳过这一行: 注释的分类 单行注释 # 这 ...

  10. 线程之-volatile

    线程作为java面试中必须要掌握的一环,volatile多少也会在面试中被问到,所以就需要好好研究下,以面对面试官的问题. 首先要清楚线程不安全是什么原因引起的,需要明白计算机的cpu执行每条指令时都 ...