我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

详解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

您可能感兴趣的文章:Android数据持久化之ContentProvider机制详解Android数据持久化之读写SD卡中内容的方法详解Android数据持久化之I/O操作详解Android数据持久化之File机制分析Android数据持久化之Preferences机制详解Android仿QQ好友列表分组实现增删改及持久化Android持久化技术之SharedPreferences存储实例详解Android持久化技术之文件的读取与写入实例详解Android SQLite数据库增删改查操作的使用详解Android开发之SQLite的使用方法Android使用SQLite数据库的简单实例Android数据持久化之SQLite数据库用法分析


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

其实我们在社交网络上面所发出的任何信息, 都希望能够保留下来. 那么如何实现呢 数据持久化 数据持久化, 就是将内存中的瞬时数据保存在存储设备中, 保证即便关机之后, 数据仍然存在. 保存在内存中的数据是瞬时数据, 保存在存储设备中的数据就
2022-06-06

如何在Android开发中利用数据持久化存储文件

这期内容当中小编将会给大家带来有关如何在Android开发中利用数据持久化存储文件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。数据持久化数据持久化, 就是将内存中的瞬时数据保存在存储设备中, 保证即便关
2023-05-31

Android开发之数据的存储方式详解

在Android中,数据的存储分为两种方式: 1、直接以文件的形式存储在目录中 2、以json格式存储在数据库中 将数据以文件的存储又分为两种方式: 1、生成.txt文件 2、生成xml文件 那么今天就来详细的说一下以文件的形式存储,由于没
2022-06-06

Android开发笔记之: 数据存储方式详解

无论是神马平台,神马开发环境,神马软件程序,数据都是核心。对于开发平台来讲,如果对数据的存储有良好的支持,那么对应用程序的开发将会有很大的促进作用。总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络。其中文件和数据库可
2022-06-06

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

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

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录