目录
本地存储案例
该方法仅适用于保存一些比较简单的,运行时并不占用过多内存的小字段
原理介绍
我们需要完成这么一个 app:
- 在文本框输入文字后退出 app 会自动存储
- 下次打开后,检测到存储的文本文件,自动获取他并输出到文本框里
首先需要清楚:
本案例文件存储的位置是:data/data/你的工程包名/files/xxx
当手机内存不够时,data/data
目录下的文件会被自动清理以腾出空间,所以本方法不具有持久化存储的功效!
下面介绍几个获取不同存储路径的方法:
- getCacheDir():/data/data/你的应用的包名/cache
- getFilesDir():/data/data/你的应用的包名/files
- getExternalFilesDir():SDCard/Android/data/你的应用的包名/files/
- 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,直接点击测试就可以看到结果了!