第六章 数据存储

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. Html5 Canvas介绍

    1. 获取绘图上下文 var mycanvas = document.getElementById('mycanvas'); var context = mycanvas.getContext('2d ...

  2. 开始食用grpc(之二)

    开始食用grpc(之二) 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9570992.html ``` 前段时间有童鞋找我开专栏.搬家.甚至还有人找我写书的. ...

  3. 使用docker快速搭建nginx+php环境

    在朋友的强烈推荐下,走上了docker之路.经过了繁琐的docker环境安装,看了下镜像/容器的简单使用,开始进行nginx+php环境的搭建,本文记录一下在安装过程中的笔记. 原文地址:代码汇个人博 ...

  4. LinuxMint(Ubuntu)安装文泉驿家族黑体字

    文泉驿黑体字家族在Ubuntu上很有用,可以解决系统字体发虚的问题. 通过下面的三条命令安装: sudo apt-get install ttf-wqy-microhei #文泉驿-微米黑 sudo ...

  5. python已经感觉到放弃接近的day08

    居然能超过一个星期,我甚至都有点佩服我自己了,今天有两个新的知识点,一个简单一个难,先从简单的开始入手吧,进制,进制分为4种,2进制,8进制,10进制,16进制,一般最常用的就是10进制了,计算机用的 ...

  6. php之微信公众号发送模板消息

    讲一下开发项目中微信公众号发送模板消息的实现过程(我用的还是Thinkphp5.0). 先看一下效果,如图: 就是类似于这样的,下面讲一下实现过程: 第一步:微信公众号申请模板消息权限: 立即申请: ...

  7. DDctf 新得

    滴这道题当时做的时候只做到了看到index.php的源码 当时给了一个博客的提示猜到是swp的那个 但是没有想到是里面的 文件就没有做了,然后在看了wp过后就明白了 访问博客我文章里面的文章里面的pr ...

  8. c++ 指针做为参数和返回值

    指针参数 返回值是指针 一.指针作参数形式的函数 //计算x的平方 x*x void square(int *x) { int a=*x; *x=a*a; } 二.指针作返回值的函数 int *squ ...

  9. Jsp监听器

    监听器: 监听器就是对内置对象的状态或者属性变化进行监听,并且做出反应的特殊的servlet,在web.xml文件中对监听器进行的配置. 内置对象有两种状态变化:产生.销毁,就是当产生内置对象的时候能 ...

  10. myeclipse新建javaweb项目,并部署到tomcat

    myeclipse使用的版本: 新建web项目: File-->New-->Web Project,输入项目名称,选择J2EE规范. 完成后: JRE System Library是只要做 ...