详解Android开发数据持久化之文件存储(附源码)

其实我们在社交网络上面所发出的任何信息, 都希望能够保留下来. 那么如何实现呢?

数据持久化

数据持久化, 就是将内存中的瞬时数据保存在存储设备中, 保证即便关机之后, 数据仍然存在.

保存在内存中的数据是瞬时数据, 保存在存储设备中的数据就是处于持久状态的.

持久化技术则是提供了一种机制可以让数据在瞬时状态和持久状态之间进行转换, Android系统中主要提供了3种方式用于简单地实现数据持久化功能, 即文件存储, SharePreference存储, 以及数据库存储. 当然你也可以将数据保存在手机的SD卡中.

文件存储

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

将数据存储在文件中

Context类中提供了一个openFileOutput()方法, 可以用于将数据存储在指定的文件中. 这个方法接收两个参数,

第一个参数是文件名, 在文件创建的时候使用的就是这个名称, 注意这里指定的文件名不可以包含路径的. 因为所有的文件都是默认存储到/data/data/<package name>/files/目录下.

第二个参数是文件的操作模式, 主要有两种模式可以选, MODE_PRIVATE和MODE_APPEND. 其中MODE_PRIVATE是默认的操作模式, 表示当指定同样文件名的时候, 所写入的内容将会覆盖原文件中的内容. 而MODE_APPEND则表示如果该文件已存在, 就往文件里面追加内容, 不存在就创建新文件.

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

public void save(){ String data = "Data to save"; FileOutputStream out = null; BufferedWriter writer = null; try { out = openFileOutput("data", Context.MODE_PRIVATE); writer = new BufferedWriter(new OutputStreamWriter(out)); writer.write(data); }catch (IOException e) { e.printStackTrace(); } finally { try { if(writer!= null){ writer.close(); } } catch (IOException e) { e.printStackTrace(); } } }

说明: 通过openFileOutput()方法能够得到一个FileOutputStream对象, 然后再借助它构建出一个OutputStreamWriter对象, 接着再使用OutputStreamWriter构建出一个BufferedWriter对象, 这样就可以通过BufferedWriter来讲文本内容写入到文件中了.

下面我们来一个完整的例子来理解一下,当我们在退出程序之前, 将我们在文本框中输入的内容储存在文件中.

新建项目FilePersistenceDemo项目, 且修改activity_main.xml中的代码.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <EditText android:id="@+id/edit" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>

说明: 界面只有一个EditText文本框.

MainActivity.java文件:

public class MainActivity extends AppCompatActivity { private EditText editText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取editText实例 editText = (EditText)findViewById(R.id.edit); } // 重写onDestroy(), 可以保证活动销毁之前一定会调用这个方法. @Override protected void onDestroy() { super.onDestroy(); String inputText = editText.getText().toString(); save(inputText); } public void save (String inputText){ FileOutputStream out = null; BufferedWriter writer = null; try { out = openFileOutput("data", Context.MODE_PRIVATE); writer = new BufferedWriter(new OutputStreamWriter(out)); writer.write(inputText); } catch (IOException e) { e.printStackTrace(); } finally { try { if(writer!= null) { writer.close(); } } catch (IOException e) { e.printStackTrace(); } } } }

那么我们运行程序, 我们输入的内容就会保存在文件中. 如果您的手机已经Root了, 可以直接在 应用程序的包名/files目录就可以发现.

从文件中读取数据

核心代码:

public String load (){ FileInputStream in = null; BufferedReader reader = null; StringBuilder content = new StringBuilder(); try { //获取FileInputStream对象 in = openFileInput("data"); //借助FileInputStream对象, 构建出一个BufferedReader对象 reader = new BufferedReader(new InputStreamReader(in)); String line = ""; //通过BufferedReader对象进行一行行的读取, 把文件中的所有内容全部读取出来 // 并存放在StringBuilder对象中 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(); }

修改我们MainActivity中的代码:

public class MainActivity extends AppCompatActivity { private EditText editText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取editText实例 editText = (EditText)findViewById(R.id.edit); String inputText = load(); //TextUtils.isEmpty()可以一次性判断两种非空判断 传入null或者空, 都返回true if(!TextUtils.isEmpty((inputText))){ editText.setText(inputText); //setSelection()表示将光标移动在文本框的末尾位置, 以便继续输入 editText.setSelection(inputText.length()); //弹出Toast, 给出一个提示, 表示读取数据成功 Toast.makeText(this, "读取数据成功!", Toast.LENGTH_SHORT).show(); } } // 重写onDestroy(), 可以保证活动销毁之前一定会调用这个方法. @Override protected void onDestroy() { super.onDestroy(); String inputText = editText.getText().toString(); save(inputText); } public void save (String inputText){ FileOutputStream out = null; BufferedWriter writer = null; try { out = openFileOutput("data", Context.MODE_PRIVATE); writer = new BufferedWriter(new OutputStreamWriter(out)); writer.write(inputText); } catch (IOException e) { e.printStackTrace(); } finally { try { if(writer!= null) { writer.close(); } } catch (IOException e) { e.printStackTrace(); } } } public String load (){ FileInputStream in = null; BufferedReader reader = null; StringBuilder content = new StringBuilder(); try { //获取FileInputStream对象 in = openFileInput("data"); //借助FileInputStream对象, 构建出一个BufferedReader对象 reader = new BufferedReader(new InputStreamReader(in)); String line = ""; //通过BufferedReader对象进行一行行的读取, 把文件中的所有内容全部读取出来 // 并存放在StringBuilder对象中 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(); } }

效果演示

源码地址:FilePersistenceDemo_jb51.rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-10-24 22:28:34

详解Android开发数据持久化之文件存储(附源码)的相关文章

求vb.net2010读取excel数据生成xml文件的实例源码

问题描述 求vb.net2010读取excel数据生成xml文件的实例源码.刚刚开始学习,需要做个小工具.读取excel表格中的数据,生成一个XML文件.求各路英雄大虾给个示例源码学习学习.谢谢了! 解决方案 解决方案二:分两部分1.读取EXCEL数据表的数据.2.处理表的非法内容3.写入XML文件.解决方案三:这种源码百度就能搜到解决方案四:引用1楼notbb的回复: 分两部分1.读取EXCEL数据表的数据.2.处理表的非法内容3.写入XML文件. 能写个源码发来学习学习吗?我是业余初学者.想

仿酷狗音乐播放器开发日志二十一 开发动态调色板控件(附源码)

转载请说明原出处,谢谢~~           上一篇仿酷狗日志结束后,整个换肤功能就只剩下调色板功能没有做了,我本以为会很简单,但是研究了酷狗的调色板功能后发现不是那么简单的事情.首先看一下酷狗的调色板的样子:         我原本以为酷狗的主界面只是一张图片,然后通过鼠标坐标来选择颜色,简单粗暴.等我开始做这部分时发现情况不一样.         可以看到,酷狗的调色板分为两部分,上半部分是调色板的主界面,下半部分是调整亮度的工具栏,我这里分别给他们起名为Pallet和Bar方便说明.这个

详解Android开发中Fragment的使用_java

前言学习Java和Android将近一年的时间了,期间的成果应该就是独立完成了一个Android客户端,并且保证了其在主线版本的稳定性.期间遇到了很多坑,也跟着师兄学到了很多Android知识.但是人总是要拥抱变化,不能让自己太安逸,虽然有不舍,但是我已经证明了自己的学习能力,下一步就是开始做Rom Porting了.这里总结一下之前项目中用到最多的Fragment. Fragment简介Fragment可以理解成Activity中用户界面的一个行为或者一部分,它必须被嵌套在Activity中.

详解android使用SAX解析XML文件_Android

解析XML的方式有很多种,大家比较熟悉的可能就是DOM解析. DOM(文件对象模型)解析:解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以根据DOM接口来操作这个树结构了. 优点:整个文档读入内存,方便操作:支持修改.删除和重现排列等多种功能. 缺点:将整个文档读入内存中,保留了过多的不需要的节点,浪费内存和空间. 使用场合:一旦读入文档,还需要多次对文档进行操作,并且在硬件资源充足的情况下(内存,CPU). 为了解决DOM解析存在的问题,就出现了SAX解析.其特点为: 优点:不

详解Android提交数据到服务器的两种方式四种方法_Android

Android应用开发中,会经常要提交数据到服务器和从服务器得到数据,本文主要是给出了利用http协议采用HttpClient方式向服务器提交数据的方法. 代码比较简单,这里不去过多的阐述,直接看代码. /** * @author Dylan * 本类封装了Android中向web服务器提交数据的两种方式四种方法 */ public class SubmitDataByHttpClientAndOrdinaryWay { /** * 使用get请求以普通方式提交数据 * @param map 传

详解Android开发中ContentObserver类的使用_Android

ContentObserver--内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于 数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它.触发器分为表触发器.行触发器, 相应地ContentObserver也分为"表"ContentObserver."行"ContentObserver,当然这是与它所监听的Uri MIME Type有关的. 熟悉Content Prov

详解Android开发中Activity的四种launchMode_Android

Activity栈主要用于管理Activity的切换.当使用Intent跳转至某个目标Activity,需要根据目标Activity的加载模式来加载. Activity一共有以下四种launchMode: 1.standard:默认,每次使用Intent跳转到目标Activity时都创建一个新的实例.坏处是每次进入都要创建新的实例,执行OnCreate方法. 2.singleTop:如果要跳转的目标Activity正好在task的顶部(说明当前肯定不在目标task里,例如我在微信首页,然后想使用

【android-tips】如何在android应用中插入百度广告(附源码)

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.介绍    现在游戏中的广告基本上已经成为了游戏创作者的一个重要的收入来源.其实插入广告还是挺简单的,本文选择百度广告联盟作为案例(总觉得百度不会拖欠工资).注:不过,插入广告程序会稍微卡一些,而且真的很耗流量. (本文并不是照抄百度的文档,会很直白哦) 2.代码部分    首先肯定是注册百度广告联盟的账号,和下载sdk.地址:http://munion.baidu.com/     第二步,打开ecli

jQuery 行级解析读取XML文件(附源码)_jquery

最近在做一个项目,因为页面使用了Cookie,所以要判断用户的浏览器是否支持Cookie,并提示用户如何开启浏览器的Cookie功能.同时,整个项目要配置多语言支持,包括中文.越南语.日语和英语,所以必须有语言配置文件.项目中应用jQuery解析读取XML语言配置文件来实现语言的调度.这是jQuery解析读取XML文件功能的测试源码,现拿出来分享.目录结构: main.css文件代码: 复制代码 代码如下: @CHARSET "UTF-8"; * { margin: 0px; padd