第六章 数据存储

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. CVE-2017-1000405 利用脏牛漏洞Linux提权复现

    当前路径: /var/www 磁盘列表: / 系统信息: Linux zico 3.2.0-23-generic #36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012 ...

  2. Java HashMap 使用了未经检查或不安全的操作

    今天在做接口测试的时候使用了Java中的Map(java 所知胜少,因项目需要提供示例),不扯犊子了,我们直接看一个代码文件名:Test.java: import java.util.ArrayLis ...

  3. 现代Java进阶之路必备技能——2019 版

    Java技术的学习阶段有三 第1个是java基础,比如对集合类,并发,IO,JVM,内存模型,泛型,异常,反射,等有深入了解. 第2个是全面的互联网技术相关知识,比如redis,mogodb,ngin ...

  4. CentOS下MySQL的安装

    MySQL数据库是一款比较常用的数据库,大家在练习安装时,可能会遇到各种各样的问题,请大家参考在CentOS系统下MySQL数据库的安装方式.如有任何问题,欢迎留言,本人随时解答. MySQL安装步骤 ...

  5. Java_基础篇(数组排序)

    Java_基础之数组排序(从小到大) 1.冒泡排序: 冒泡排序可以写成两层循环. 每次循环将最大的数值交换到数组的最后一个. 每排序完一次,后面就少比较一次.所以二层循环的判断条件写成:arry.le ...

  6. Myeclipse10.7添加本地插件方法

    -

  7. css 半圆效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Canvas 绘图学习笔记2

    1 绘制文本 fillText(string,x,y,maxWidth)  //填充试绘制文本 strokeText(string,x,y,maxWidth) 画线试绘制文本 设置字体样式: cont ...

  9. c/c++ 模板函数的重载

    模板函数的重载 普通函数可以重载,模板函数也可以重载,但规则复杂 有下面2个函数,名字相同,返回值相同就,参数不同,符合重载. template<typename T> std::stri ...

  10. react this的作用域问题,麻烦大佬们帮我解决一下

    element里面有个Table组件,我想在编辑和删除那里加上点击事件,但是发现点击方法没有效果 这里面的this看起来好像只针对这个作用域里面的,这里没有办法设置状态,也不能调用方法 设置状态会出现 ...