热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

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

其实我们在社交网络上面所发出的任何信息, 都希望能够保留下来. 那么如何实现呢? 数据持久化 数据持久化, 就是将内存中的瞬时数

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

数据持久化

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

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

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

文件存储

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

将数据存储在文件中

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

第一个参数是文件名, 在文件创建的时候使用的就是这个名称, 注意这里指定的文件名不可以包含路径的. 因为所有的文件都是默认存储到/data/data//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中的代码.


  

说明: 界面只有一个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

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


推荐阅读
  • 在探讨Hibernate框架的高级特性时,缓存机制和懒加载策略是提升数据操作效率的关键要素。缓存策略能够显著减少数据库访问次数,从而提高应用性能,特别是在处理频繁访问的数据时。Hibernate提供了多层次的缓存支持,包括一级缓存和二级缓存,以满足不同场景下的需求。懒加载策略则通过按需加载关联对象,进一步优化了资源利用和响应时间。本文将深入分析这些机制的实现原理及其最佳实践。 ... [详细]
  • 本文探讨了如何有效地构建和优化微信公众平台账号,涵盖了用户信息管理、内容创作与发布、互动策略及数据分析等方面。通过合理设置用户信息字段,如用户名、昵称、密码、真实姓名和性别等,确保账号的安全性和用户体验。同时,文章还介绍了如何利用微信公众平台的各项功能,提升用户参与度和品牌影响力。 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • 本文探讨了Android系统中支持的图像格式及其在不同版本中的兼容性问题,重点涵盖了存储、HTTP传输、相机功能以及SparseArray的应用。文章详细分析了从Android 10 (API 29) 到Android 11 的存储规范变化,并讨论了这些变化对图像处理的影响。此外,还介绍了如何通过系统升级和代码优化来解决版本兼容性问题,以确保应用程序在不同Android版本中稳定运行。 ... [详细]
  • 资源管理器的基础架构包括三个核心组件:1)资源池,用于将CPU和内存等资源分配给不同的容器;2)负载组,负责承载任务并将其分配到相应的资源池;3)分类函数,用于将不同的会话映射到合适的负载组。该系统提供了两种主要的资源管理策略。 ... [详细]
  • 在使用SSH框架进行项目开发时,经常会遇到一些常见的问题。例如,在Spring配置文件中配置AOP事务声明后,进行单元测试时可能会出现“No Hibernate Session bound to thread”的错误。本文将详细探讨这一问题的原因,并提供有效的解决方案,帮助开发者顺利解决此类问题。 ... [详细]
  • Java解析YAML文件并转换为JSON格式(支持JSON与XML的结构化查询)
    本文探讨了如何利用Java解析YAML文件并将其转换为JSON格式,同时支持JSON和XML的结构化查询。YAML、JSON和XML这三种数据格式通过其名称作为文件扩展名,便于区分和使用。文章详细介绍了这些格式的层次结构和数据表示方法,并重点讨论了在数据传输过程中,XML的特性和优势。此外,还提供了具体的代码示例和实现步骤,帮助开发者高效地进行数据格式转换和查询操作。 ... [详细]
  • Spring框架的核心组件与架构解析 ... [详细]
  • 本文详细解析了微信服务端示例类的功能与应用。其中,`ClientResponseHandler` 类主要用于处理微信支付所需的响应数据,而 `TenpayHttpClient` 则是对 HTTP 请求(包括 GET 和 POST 方法)进行了封装,以便在内部调用时更加便捷和高效。这些工具类在实际开发中起到了关键作用,开发者无需深入了解其底层实现细节,即可轻松集成微信支付功能。 ... [详细]
  • 在前文探讨了Spring如何为特定的bean选择合适的通知器后,本文将进一步深入分析Spring AOP框架中代理对象的生成机制。具体而言,我们将详细解析如何通过代理技术将通知器(Advisor)中包含的通知(Advice)应用到目标bean上,以实现切面编程的核心功能。 ... [详细]
  • 深入解析:React与Webpack配置进阶指南(第二部分)
    在本篇进阶指南的第二部分中,我们将继续探讨 React 与 Webpack 的高级配置技巧。通过实际案例,我们将展示如何使用 React 和 Webpack 构建一个简单的 Todo 应用程序,具体包括 `TodoApp.js` 文件中的代码实现,如导入 React 和自定义组件 `TodoList`。此外,我们还将深入讲解 Webpack 配置文件的优化方法,以提升开发效率和应用性能。 ... [详细]
  • 本文详细介绍了如何安全地手动卸载Exchange Server 2003,以确保系统的稳定性和数据的完整性。根据微软官方支持文档(https://support.microsoft.com/kb833396/zh-cn),在进行卸载操作前,需要特别注意备份重要数据,并遵循一系列严格的步骤,以避免对现有网络环境造成不利影响。此外,文章还提供了详细的故障排除指南,帮助管理员在遇到问题时能够迅速解决,确保整个卸载过程顺利进行。 ... [详细]
  • 从文本中全面提取所有URL链接
    本文探讨了一种高效的方法,用于从大量文本数据中全面提取所有URL链接。通过使用正则表达式和Python编程语言,该方法能够准确识别并提取出各种格式的URL,包括HTTP、HTTPS等常见协议。实验结果表明,该方法在处理大规模文本数据时具有较高的准确率和效率。 ... [详细]
  • 润乾报表JNDI配置异常分析与解决方法
    在使用润乾报表时,通过JNDI连接数据源是常见的配置方式。本文详细分析了JNDI配置异常的原因,并提供了具体的解决方法。重点讨论了JNDI名称在三个关键位置的配置:1. Tomcat或应用服务器的数据源配置(以Tomcat为例);2. 润乾报表中的数据源配置;3. 应用程序代码中的JNDI名称引用。通过这些步骤,可以有效解决JNDI配置异常问题,确保报表系统的稳定运行。 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
author-avatar
伊华Zhu
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有