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

   日期:2020-11-10     浏览:87    评论:0    
核心提示:~本特利~学习笔记持久化技术简介第一种方式:文件存储将数据存储到文件中从文件中读取数据案例-文件存储技术MainActivity.ktactivity_main.xml持久化技术简介数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或计算机关机的情况下,这些数据仍然不会丢失。保存在内存中的数据是处于瞬时状态的,而保存在存储设备中的数据是处于持久状态的。持久化技术提供了一种机制,可以让数据在瞬时状态和持久状态之间进行转换。Android系统中主要提供了3种方式用于简单
~本特利~

学习笔记

    • 持久化技术简介
    • 第一种方式:文件存储
      • 将数据存储到文件中
      • 从文件中读取数据
    • 案例-文件存储技术
      • 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()方法。

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服