数据存储之文件存储
class MainActivity : AppCompatActivity() {
private lateinit var mEditText: EditText
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mEditText = findViewById(R.id.editText)
val inputText = load()
if (inputText.isNotEmpty()){
mEditText.setText(inputText)
mEditText.setSelection(inputText.length) //这里是将输入的光标移动到文本的末尾,以便继续输入
Toast.makeText(this, "Restoring success", Toast.LENGTH_SHORT).show()
}
}
private fun load(): String{
val content = StringBuilder()
try {
val openFileInput = openFileInput("data") //Context类提供
val inputStreamReader = InputStreamReader(openFileInput)
val bufferedReader = BufferedReader(inputStreamReader)
bufferedReader.use {
bufferedReader.forEachLine { //一行行读取数据
content.append(it) //拼接到StringBuilder对象中
}
}
}catch (e: IOException){
e.printStackTrace()
}
return content.toString()
}
override fun onDestroy() {
super.onDestroy()
val inputText = mEditText.text.toString()
save(inputText)
}
/**
* openFileOutput (构建) 写入数据到文件中 Context类提供
* 构建FileOutputStream 文件字节输出流
* 构建OutputStreamWriter 从字符流到字节流的桥接
* 1、字符的输出需要通过字符流来操作,但是本质最后还是通过字节流输出到计算机上进行存储的
2、 因此OutputStreamWriter流的作用就是利用字节流作为底层输出流然后构建字符输出流,
字符输出流输出字符到流中,然后通过指定的字符集把流中的字符编码成字节输出到字节流中,
其作用就是一个桥梁,使得双方链接起来
* 构建BufferedWriter,通过它将文本内容写入文件中
* Context.MODE_PRIVATE 当指定相同文件名时,所写的内容会覆盖原文件中的内容
* Context.MODE_APPEND 当文件已存在,就在文件内追加其内容,不存在就创建新的文件
*/
private fun save(inputText: String) {
try {
val openFileOutput = openFileOutput("data", Context.MODE_PRIVATE)
val bufferedWriter = BufferedWriter(OutputStreamWriter(openFileOutput))
bufferedWriter.use { //use函数,会保证在Lambda表达式中的代码全部执行完自动将外层的流关闭,这样就不需要编写finally语句,手动的关闭流了
it.write(inputText)
}
}catch (e: IOException){
e.printStackTrace()
}
}
}