Android本地存储方法浅析介绍

目录
  • 本地存储案例
  • 原理介绍
  • 设置文本输入框
  • 存储读取数据

本地存储案例

该方法仅适用于保存一些比较简单的,运行时并不占用过多内存的小字段

原理介绍

我们需要完成这么一个 app:

  1. 在文本框输入文字后退出 app 会自动存储
  2. 下次打开后,检测到存储的文本文件,自动获取他并输出到文本框里

首先需要清楚:

本案例文件存储的位置是:data/data/你的工程包名/files/xxx

当手机内存不够时,data/data 目录下的文件会被自动清理以腾出空间,所以本方法不具有持久化存储的功效!

下面介绍几个获取不同存储路径的方法:

  1. getCacheDir():/data/data/你的应用的包名/cache
  2. getFilesDir():/data/data/你的应用的包名/files
  3. getExternalFilesDir():SDCard/Android/data/你的应用的包名/files/
  4. getExternalCacheDir():SDCard/Android/data/你的应用包名/cache/

一般的,由于目前手机都是一体机且无法再扩展外存,所以存储到 SD 卡的解决方式可行性较高!

设置文本输入框

在 mainactivity 的布局文件随意添加一个文本输入框

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editText"
        android:hint="请输入内容"/>
</LinearLayout>

存储读取数据

首先我们需要定义一个存储文件的方法

private fun save(inputText: String) {
    try {
        // 打开输出文件,如果不存在就新建一个
        val output = openFileOutput("data", Context.MODE_PRIVATE)
        // 设置输出流
        val writer = BufferedWriter(OutputStreamWriter(output))
        // 使用use语法,在输出所有内容完毕后就会自动关闭流,不需要手动关闭了!
        writer.use {
            it.write(inputText)
        }
    } catch (e: IOException) {
        e.printStackTrace()
    }
}

既然有了存储,那必须还有一个读取,依葫芦画瓢即可

private fun load(): String {
    // 存储获取到的文本
    val content = StringBuilder()
    try {
        // 打开文件
        val input = openFileInput("data")
        // 设置输入流
        val reader = BufferedReader(InputStreamReader(input))
        reader.use {
            // 逐行输入到content变量
            reader.forEachLine {
                content.append(it)
            }
        }
    } catch (e: IOException) {
        e.printStackTrace()
    }
    // 返回得到的文字文本数据
    return content.toString()
}

理解完以上两个主要代码后,我们组合到 MainActivity.kt 文件内,最终得到的代码如下:

package com.zhiyiyi.listviewdemo
import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_main.*
import java.io.*
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        // activity打开前读取存储的文件,拿出内容
        val inputText = load()
        if (inputText.isNotEmpty()) {
            editText.setText(inputText)
            editText.setSelection(inputText.length)
            Toast.makeText(this, "Restoring succeeded", Toast.LENGTH_SHORT).show()
        }
    }
    // activity销毁前执行存储方法
    override fun onDestroy() {
        super.onDestroy()
        val inputText = editText.text.toString()
        save(inputText)
    }
    // 存储
    private fun save(inputText: String) {
        try {
            val output = openFileOutput("data", Context.MODE_PRIVATE)
            val writer = BufferedWriter(OutputStreamWriter(output))
            writer.use {
                it.write(inputText)
            }
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }
    // 读取
    private fun load(): String {
        val content = StringBuilder()
        try {
            val input = openFileInput("data")
            val reader = BufferedReader(InputStreamReader(input))
            reader.use {
                reader.forEachLine {
                    content.append(it)
                }
            }
        } catch (e: IOException) {
            e.printStackTrace()
        }
        return content.toString()
    }
}

END,直接点击测试就可以看到结果了!

到此这篇关于Android本地存储方法浅析介绍的文章就介绍到这了,更多相关Android本地存储内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android本地存储SharedPreferences详解

    Android本地存储SharedPreferences详解 存储位置 SharedPreferences数据保存在: /data /data/<package_name> /shared_prefs 文件夹下,以XML格式保存,根元素为:<map />.文件名称为获取SharedPreferences实例时传递的參数值. <map> <int name="key" value="value" /> <strin

  • js浏览器本地存储store.js介绍及应用

    store.js - 轻松实现本地存储(LocalStorage) store.js 是一个兼容所有浏览器的 LocalStorage 包装器,不需要借助 Cookie 或者 Flash.store.js 会根据浏览器自动选择使用 localStorage.globalStorage 或者 userData 来实现本地存储功能. store.js 提供非常简洁的 API 来实现跨浏览器的本地存储功能: 复制代码 代码如下: store.set('username', 'marcus') stor

  • web基于浏览器的本地存储方法应用

    在客户端存储数据时,我们一般都用cookie(不敏感数据),但是在客户端越来越富的今天,cookie可存储的量(每个域最大4k)实在是小. 在HTML5中有localStorage可使用,但是这就抛弃了IE8-.为了兼容,我们可以翻出IE很久以前就搞的一个存储方法: 给一个元素添加一个特殊的样式url(#default#userData),之后就可以通过setAttribute和getAttribute来存取键值对形式的数据了. 要注意的一点就是在数据改变后要使用save方法,而数据加载初期要l

  • Android外部存储无法访问问题解决方法

    最近在做Android 应用开发,IDE是android studio , 使用的版本配置如下: compileSdk 32 buildToolsVersion '32.0.0' defaultConfig { applicationId "com.example.gzpersonmanager" minSdk 21 targetSdk 32 versionCode 1 versionName "1.0" testInstrumentationRunner &quo

  • Android本地验证码的简易实现方法(防止暴力登录)

    0.  前言  验证码无处不在,有人问我,你知道达芬奇密码下面是什么吗,对,答案就是达芬奇验证码. 验证码一个最主要的作用就是防止恶意暴力破解登录,防止不间断的登录尝试,有人说其实可以在服务器端对该终端进行登录间隔检测,如果间隔太短可以展示拒绝的姿态.但是还是本地验证码作用更加实在,可以减轻服务器端的压力.这篇将使用自定义View来实现一个如下效果的简易本地验证码.算是对自定义View知识的复习吧. 1.  布局结构  <RelativeLayout xmlns:android="http

  • 浅析Android文件存储

    一.内部存储 内部存储,位于data/data/包名/路径下 是否需要用户权限:否 是否能被其他应用访问:否 卸载应用数据是否被删除:是 内部存储控件不需要用户权限,这意味着我们不需要用户去授权下面的权限: android.permission.WRITE_EXTERNAL_STORAGE android.permission.READ_EXTERNAL_STORAGE 对于设备中每一个安装的 App,系统都会在 data/data 目录下以应用程序包名自动创建与之对应的文件夹,可以直接读写该目

  • K8S节点本地存储被撑爆问题彻底解决方法

    目录 存储的内容 镜像 可写层 日志 emptyDir 存储的限制方法 K8S的GC 日志总量限制 emptyDir Volume 限制 临时数据的总量限制 存储的内容 现在云原生越来越流行,很多企业都上马了K8S,但是这里边也有很多的坑要填,这篇文章就聊一下K8S节点本地存储被撑爆的问题,也就是磁盘被占满的问题. 要解决存储使用过多的问题,就得先了解存储中都保存了些什么内容,否则解决不了问题,还可能带来更多的风险. 镜像 容器要在节点上运行,kubelet 首先要拉取容器镜像到节点本地,然后再

  • JS实现本地存储信息的方法(基于localStorage与userData)

    本文实例讲述了JS实现本地存储信息的方法.分享给大家供大家参考,具体如下: WEB应用的快速发展,是的本地存储一些数据也成为一种重要的需求,实现的方案也有很多,最普通的就是cookie了,大家也经常都用,但是cookie的缺点是显而易见的,其他的方案比如:IE6以上的userData,Firefox下面的globalStorage,以及Flash的本地存储,除了Flash之外,其他的几个都有一些兼容性的问题. sessionStorage与localStorage Web Storage实际上由

  • PHP下载远程文件到本地存储的方法

    本文实例讲述了PHP下载远程文件到本地存储的方法.分享给大家供大家参考.具体实现方法如下: <?php function GrabImage($url,$filename="") { if($url=="") return false; if($filename=="") { $ext=strrchr($url,"."); if($ext!=".gif" && $ext!="

  • Android 中LayoutInflater.inflate()方法的介绍

    Android 中LayoutInflater.inflate()方法的介绍 最近一直想弄明白LayoutInflater对象的inflate方法的用法,今天做了实例. <LinearLayout android:id="@+id/ll_item_Group" android:layout_width="match_parent" android:layout_height="200dp" android:background="

随机推荐