文件存储技术-数据持久化-Android

~本特利~

学习笔记

    • 持久化技术简介
    • 第一种方式:文件存储
      • 将数据存储到文件中
      • 从文件中读取数据
    • 案例-文件存储技术
      • MainActivity.kt
      • activity_main.xml


持久化技术简介

数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或计算机关机的情况下,这些数据仍然不会丢失。

保存在内存中的数据是处于瞬时状态的,而保存在存储设备中的数据是处于持久状态的。持久化技术提供了一种机制,可以让数据在瞬时状态和持久状态之间进行转换。

Android系统中主要提供了3种方式用于简单地实现数据持久化功能:
文件存储、SharedPreferences存储、数据库存储。


第一种方式:文件存储

文件存储是Android中最基本的数据存储方式,它不对存储的内容进行任何格式化处理,所有数据都是原封不动地保存到文件当中的,因而它比较适合存储一些简单的文本数据或二进制数据。

如果你想使用文件存储的方式来保存一些较为复杂的结构化数据,就需要定义一套自己的格式规范,方便之后将数据从文件中重新解析出来。


将数据存储到文件中

Context类中提供了一个openFileOutput()方法,可以用于将数据存储到指定的文件中。

所有的文件会默认存储到/data/data//files/目录下。示例写法如下:

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()
    }
}

Context 类中提供了一个openFileOutput( )方法,让我们可以将数据存储在指定位置,该文件接收两个参数,第一个是文件名,第二个是文件的操作模式,主要有MODE_PRIVATE(默认的,有覆盖内容的作用)和MODE_APPEND(不覆盖但有追加和创建作用)两种。

代码分析:

  1. 通过一个openFileOutput( )方法得到FileOutputStream对象-output
  2. 借助output构建出OutputStreamWriter对象
  3. 使用OutputStreamWriter构建BufferedWriter对象-writer
  4. 这样就可以通过BufferedWriter把内容写入文件,最后使用kotlin提供的内置扩展函数use自动将外层的流关闭。

从文件中读取数据

Context类中还提供了一个openFileInput()方法,用于从文件中读取数据。

它会自动到/data/data//files/目录下加载文件,并返回一个FileInputStream对象,得到这个对象之后,再通过流的方式就可以将数据读取出来了。示例写法如下:

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()
}

代码分析:

  1. 通过一个openFileInput( )方法得到FileOutputStream对象-intput
  2. 借助intput构建出InputStreamReader对象
  3. 使用InputStreamReader构建BufferedReader对象-reader
  4. 这样就可以通过BufferedReader把内容读取文件
  5. 再拼接到StringBuilder对象中,最后把读取的内容返回
    6.函数use可自动将外层的流关闭,并在其中使用forEachLine函数,他会将读取的内容回调到Lambda表达式中

案例-文件存储技术

MainActivity.kt

class MainActivity : AppCompatActivity() {
     

    override fun onCreate(savedInstanceState: Bundle?) {
     
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
         //1.在onCreate()方法中调用load()方法读取文件中存储的内容
        val inputText = load()
        //如果不为空,就调用EditText的setText()方法将内容填充到 EditText中
        if (inputText.isNotEmpty()) {
     
            editText.setText(inputText)
            //再调用setSelection()方法将输入光标移动到文末以便继续输入
            editText.setSelection(inputText.length)
            //然后弹出还原成功的Toast提示
            Toast.makeText(this, "还原成功", Toast.LENGTH_SHORT).show()
        }
    }
	
	//重写onDestroy()方法,保证Activity在销毁之前一定会用到的方法
    override fun onDestroy() {
     
        super.onDestroy()
        //获取EditText中输入的内容
        val inputText = editText.text.toString()
        //调用save()方法将内容存储到文件中
        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()
    }


}

activity_main.xml

<?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:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Type something here"
    />

</LinearLayout>

总结: 核心技术就是openFileInput()和 openFileOutput()方法。

你可能感兴趣的:(Android,android)