GitHub地址:

https://github.com/Skymqq/FileSave.git

数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失。保存在内存中的数据是处于瞬时状态的,而保存在存储设备中的数据是处于持久状态的,持久化技术则提供了一种机制可以让数据在瞬时状态和持久状态之间进行转换。

Android系统中主要提供了3中方式用于简单地实现数据持久化功能:

1.文件存储

2.SharedPreferences存储

3.数据库存储

除了以上3中方式之外,你还可以将数据保存在SD卡中,不过使用文件、SharedPreferences或数据库来保存数据会相对简单一些,而且也比SD存储更安全。

文件存储

文件存储是Android中最基本的一种数据存储方式,它不对存储的内容进行任何的格式化处理,所有的数据都是原封不动地保存到文件当中的,因而它比较适合存储一些简单的文本数据或二进制数据。如果你想使用文件存储的方式来保存一些较为复杂的文本数据,就需要定义一套自己的格式规范,这样可以方便之后将数据从文件中重新解析出来。

那么我们就来看一下,Android中是如何通过文件来保存数据的。

将数据存储到文件中:

Context类中提供了一个openFileOutput()方法,可以用于将数据存储到指定的文件中。这个方法接收两个参数,第一个是文件名,在文件创建的时候使用的就是这个名称,注意这里指定的文件名不可以包含路径,因为所有的文件都是默认存储到/data/data/<packagename>/files/目录下的。第二个参数是文件的操作模式,主要有两种模式可选,MODE_PRIVATE和MODE_APPEND。其中其中MODE_PRIVATE是默认的操作模式,表示当指定同样文件名的时候,所写入的内容将会覆盖原文件中的内容,而MODE_APPEND则表示如果该文件已存在,就往文件里面追加内容,不存在就创建新文件。

openFileOutput()方法返回的是一个FileOutputStream对象,得到了这个对象之后,就可以使用Java流的方式将数据写入到文件中了。

下面我就简单地写个demo来实现一下最基本的文件存储。

首先布局文件里放入一个EditText控件和Buttton控件,EditText控件用于输入需要保留的数据,Button控件用于响应点击监听。

activity_main.xml代码:

<?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:orientation="vertical"><EditTextandroid:id="@+id/et"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:hint="请输入需要保存到文件的数据"android:textSize="18sp" /><Buttonandroid:id="@+id/btn"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="save"android:textAllCaps="false"android:textSize="20sp"android:textStyle="bold" />
</LinearLayout>

MainActivity.java代码:

package com.example.administrator.filesave;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;public class MainActivity extends AppCompatActivity {private EditText et;private Button btn;private FileOutputStream out;private BufferedWriter writer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}private void initView() {et = (EditText) findViewById(R.id.et);btn = (Button) findViewById(R.id.btn);}@Overrideprotected void onResume() {super.onResume();btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {save();//存储数据到文件}});}private void save() {try {out = openFileOutput("data", MODE_PRIVATE);//初始化FileOutput对象writer = new BufferedWriter(new OutputStreamWriter(out));//初始化BufferedWriter(带缓存的字符输出流)try {writer.write(et.getText().toString());//将EditText控件中的数据写入输出流。Toast.makeText(this, "file already saved", Toast.LENGTH_SHORT).show();} catch (IOException e) {e.printStackTrace();}} catch (FileNotFoundException e) {e.printStackTrace();} finally {if (writer != null) {try {writer.close();//关闭输出流} catch (IOException e) {e.printStackTrace();}}}}}

自定义save()方法用来保存数据到文件,我们只需要在Button的点击监听事件中调用save()方法就可以了。

效果图:

最后,我们怎么才能看到数据已经存入到本地文件中了呢?光看这Toast提示,显然是不可取的。

这个文件的具体路径为data/data/<com.example.administrator.filesave>/files/data,首先我们得打开Device File Explorer

然后找data文件,再找一个data文件,最后找到带我们项目包名的文件,下面有个files文件夹,最后有一个data文件,打开data文件,你可以直接看到我们写入的deal friend数据,效果图如下所示:

如果你是一个足够细心的同学,在你多次输入数据之后,会发现数据只会一直被新增的数据所覆盖,原因就是我们在MainActivity.java文件中的save()方法中,为FileOutput对象初始化的时候,构造函数传参的第一个参数是“data”文件名,第二个参数为MODE_PRIVATE,这个操作模式是默认的操作模式,表示当指定同样文件名的时候,所写入的内容将会覆盖源文件中的内容,如果希望数据追加,那么只需要将操作模式设置为MODE_APPEND即可。

在MainActivity活动被销毁的时候将瞬时数据保存到文件:

这个功能就很简单了,只需要重写onDestroy()方法,然后在这里面调用save()方法就可以了。

@Overrideprotected void onDestroy() {super.onDestroy();save();//保存瞬时数据到文件}

从文件中读取数据:

上面我们实现了将数据保存到本地文件的功能,现在我们再实现一个从文件中读取数据的功能。

上面我们在MainActivity活动被销毁之后,将数据保存到本地文件中,那么我们能否在下此打开程序的时候,直接再将数据从文件中读取并显示在EditText控件中呢?显然是可以的。

类似于将数据存储到文件中,Context类中还提供了一个openFileInput()方法,用于从文件中读取数据。这个方法要比openFileOutput()简单一些,它只接收一个参数,即要读取的文件名,然后系统会自动到data/data/<package name>/files/目录下去加载这个文件,并返回一个FileInputStream对象,得到了这个对象之后再通过java流的方式就可以将数据读取出来了。

MainActivity.java代码:

package com.example.administrator.filesave;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
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 {private EditText et;private Button btn;private FileOutputStream out;private BufferedWriter writer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();//初始化控件initData();//初始化数据}private void initView() {et = (EditText) findViewById(R.id.et);btn = (Button) findViewById(R.id.btn);}private void initData() {et.setText("" + load());}@Overrideprotected void onResume() {super.onResume();btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {save();//存储数据到文件}});}private void save() {try {out = openFileOutput("data", MODE_PRIVATE);//初始化FileOutput对象writer = new BufferedWriter(new OutputStreamWriter(out));//初始化BufferedWriter(带缓存的字符输出流)try {writer.write(et.getText().toString());//将EditText控件中的数据写入输出流。Toast.makeText(this, "file already saved", Toast.LENGTH_SHORT).show();} catch (IOException e) {e.printStackTrace();}} catch (FileNotFoundException e) {e.printStackTrace();} finally {if (writer != null) {try {writer.close();//关闭输出流} catch (IOException e) {e.printStackTrace();}}}}private String load() {FileInputStream in = null;BufferedReader reader = null;StringBuilder content = new StringBuilder();try {in = openFileInput("data");reader = new BufferedReader(new InputStreamReader(in));String line = "";while ((line = reader.readLine()) != null) {content.append(line);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}}return content.toString();}@Overrideprotected void onDestroy() {super.onDestroy();save();//保存瞬时数据到文件}
}

在这段代码中,首先通过openFileInput()方法获取到了一个FileInputStream对象,然后借助它又构建出一个BufferedReader(带缓存的字符输入流)对象,这样我们就可以通过BufferedReader进行一行行地读取,把文件中所有的文本内容全部读取拼接出来,并存放在一个StringBuilder对象中,最后将读取到的内容返回就可以了。

效果图:

输入“听妈妈的话”,这个应该属于瞬时数据,然后我们退出程序即MainActivity活动被销毁,此时根据Activity的生命周期,系统会调用onDestroy()方法,然后再去调用save()方法保留数据。

再次打开程序,我们发现数据已经从文件中读取出来,并且显示到EditText控件上了。

Android数据存储之文件存储(瞬时数据的存储与读取)项目已上传GitHub相关推荐

  1. 零基础Unity做一个中秋诗词鉴赏网页,提前祝您中秋快乐!(DoTween动画 | WebGL视频 | 大文件上传GitHub)

    零基础Unity做一个中秋诗词鉴赏网页,提前祝您中秋快乐! 前言 一,环境搭建 1.1 安装Unity 1.2 添加WebGl模块 二,开发项目 2.1 导入插件 2.2 项目搭建 2.3 逻辑处理 ...

  2. dio 上传文件报错_Vue+Element UI实现断点续传、分片上传、秒传

    作者:Pseudo 转发链接:https://segmentfault.com/a/1190000023434864 凡是要知其然知其所以然 文件上传相信很多朋友都有遇到过,那或许你也遇到过当上传大文 ...

  3. element ui实现自定义上传文件-以及解决已上传文件列表消失问题

    自定义上传按钮,非自动上传,效果图 action - 就是上传的接口地址 accept - 是限制上传文件格式,设置后只能上传该格式文件, 选取-选取按钮只是选择了文件 ,但是并没有上传 若要点击上传 ...

  4. JAVA项目同时上传多个文件和多个内容

    JAVA项目同时上传多个文件和多个内容   首先这俩问题是由一个功能引发的,最近项目中有这样的要求,前端要上传多个文件用于地图描绘那些东西,但只是为了拼到地图上查看一下,并不做保存,这就引发了我的纠结 ...

  5. 每天一个linux命令(文件上传下载文件操作):【转载】用SecureCRT来上传和下载文件...

    用SSH管理linux服务器时经常需要远程与本地之间交互文件.而直接用SecureCRT自带的上传下载功能无疑是最方便的,SecureCRT下的文件传输协议有ASCII.Xmodem.Zmodem. ...

  6. java实现MinIO文件上传,并将视频文件截图,将视频封面及视频通过MinIo上传到服务器中

    java实现MinIO文件上传,并将视频文件截图,将视频封面及视频通过MinIo上传到服务器中 配置完毕,接下来开始代码编写. 说明 总过程分为两步. 1.配置MinIO的环境. 2.代码编写. 下面 ...

  7. Android studio下将项目代码上传至github包括更新,同步,创建依赖

    AS中设置GIT 一.开篇 本文讲如何使用Android Studio将项目上传到github,虽然讲上传github的文章很多,但是大部分都是使用Git Bash命令行,虽然效率高些,但是有点麻烦, ...

  8. Android Studio项目如何上传至JCenter

    Android studio Library项目上传至JCenter 配置Project目录下build.gradle dependencies {classpath 'com.jfrog.bintr ...

  9. Spring boot上传文件(图片)到阿里云OSS(直接上传到应用服务器)

    Spring boot上传文件(图片)到阿里云OSS(直接上传到应用服务器) 主要思路 上传图片的思路有两种: 第一种是上传到应用服务器,再由应用服务器上传到OSS.这种适合上传的文件较小,较为简单, ...

最新文章

  1. C# json解析字符串总是多出双引号_在JavaScript应用中将CSV转换为JSON
  2. python实现人像美颜
  3. [转]我们为什么要用vue,他解决了什么问题,如何使用它?
  4. C++之操作符重载探究(三):输出操作符重载
  5. map java 初始化赋值_Java 中 HashMap 初始化时赋值(示例代码)
  6. 若依集成ueditor富文本编辑器
  7. Delphi - 注入的方式来禁止任务管理器
  8. 戴尔DCS两周年庆 推新型数据中心设备
  9. jQuery表单插件ajaxForm,ajaxSubmit使用详解
  10. 报错:非介入式客户端验证规则中的验证类型名称必须唯一。下列验证类型出现重复...
  11. 数据挖掘实战—餐饮行业的数据挖掘之数据预处理
  12. UEditor的使用
  13. linux ncm网络性能优化,USB linux NCM usbnet驱动详解
  14. 超算优化重在存储,DAOS助力瑞金打造先进的生信大数据平台
  15. 移动端人脸风格化技术的应用
  16. 仰望流年纯白世界那抹城光(二)
  17. 【网络安全】文件包含漏洞总结
  18. 阿里云云计算高级工程师ACP认证(Alibaba Cloud Certified Professional - Cloud Computing)考试大纲
  19. IO流_递归、IO流总结
  20. python mk趋势检验_时序数据常用趋势检测方法

热门文章

  1. 图片加载之SDWebImage(上)
  2. DFiddler:A HTTP Packets Listener一个简易版的手机端的Fiddler。
  3. 好用的侧边栏菜单/面板jQuery插件
  4. git常见问题解决办法
  5. css js html记录
  6. syslog记录history历史记录
  7. 2020年高等数学方法与提高(上海理工大学)学习笔记:多元函数积分学
  8. 《公司理财》_16章_2.财务杠杆学习笔记
  9. -bash: ./demoapp: 无法执行二进制文件 问题解决
  10. 树根c语言,03-树1 树的同构 (C语言链表实现)