目录
7.2 文件存储
文件存储是 Android 中最基本的数据存储方式,它不对存储的内容进行任何格式化处理,所有数据都是原封不动地保存到文件当中的,因而它比较适合存储一些简单的文本数据或二进制数 据。如果你想使用文件存储的方式来保存一些较为复杂的结构化数据,就需要定义一套自己的 格式规范,方便之后将数据从文件中重新解析出来。
那么首先我们就来看一看,Android 中是如何通过文件来保存数据的。
7.2.1 将数据存储到文件中
Context 类中提供了一个 openFileOutput() 方法,可以用于将数据存储到指定的文件中。这 个方法接收两个参数:第一个参数是文件名,在文件创建的时候使用,注意这里指定的文件名不可以包含路径,因为所有的文件都默认存储到/data/data/<pack age name>/files/ 目录 下;第二个参数是文件的操作模式,主要有 MODE_PRIVATE 和 MODE_APPEND 两种模式可选,默认是MODE_PRIVATE,表示当指定相同文件名的时候,所写入的内容将会覆盖原文件中的内 容,而MODE_APPEND 则表示如果该文件已存在,就往文件里面追加内容,不存在就创建新文 件。其实文件的操作模式本来还有另外两种:MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE。这两种模式表示允许其他应用程序对我们程序中的文件进行读写 操作,不过由于这两种模式过于危险,很容易引起应用的安全漏洞,已在Andr oid 4.2 版本中被 废弃。
openFileOutput() 方法返回的是一个 FileOutputStream 对象,得到这个对象之后就可以 使用Java 流的方式将数据写入文件中了。以下是一段简单的代码示例,展示了如何将一段文本 内容保存到文件中:
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()
}
}
如果你已经比较熟悉 Java 流了,上面的代码一定不难理解吧。这里通过 openFileOutput() 方法能够得到一个 FileOutputStream 对象,然后借助它构建出一个 OutputStreamWriter 对象,接着再使用 OutputStreamWriter 构建出一个 BufferedWriter 对象,这样你就可以通 过BufferedWriter 将文本内容写入文件中了。
注意,这里还使用了一个 use 函数,这是 Kotlin 提供的一个内置扩展函数。它会保证在Lambda 表达式中的代码全部执行完之后自动将外层的流关闭,这样就不需要我们再编写一个finally 语句,手动去关闭流了,是一个非常好用的扩展函数。
另外,Kotlin 是没有异常检查机制(check ed e xception )的。这意味着使用