Kotlin实现Android文件保存到公共内部存储目录

使用 GPT-4o 回答,作者 GPT4oMini.app

问题:

Android开发,用Kotlin语言。实现一个文件保存的功能,代码如下: package com.example.activitytest

import android.content.Context import android.os.Bundle import android.widget.EditText import android.widget.Toast import java.io.*

class FileStoreActivity : BaseActivityClass() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.file_store_layout)
    val inputText = load()
    if (inputText.isNotEmpty()) {
        val editText1: EditText = findViewById(R.id.fileStoreEdit)
        editText1.setText(inputText)
        editText1.setSelection(inputText.length)
        Toast.makeText(this, "Restoring succeeded", Toast.LENGTH_SHORT).show()
    }
}

override fun onDestroy() {
    super.onDestroy()
    val editText1: EditText = findViewById(R.id.fileStoreEdit)
    val inputText = editText1.text.toString()
    save(inputText)
}

private fun save(inputText: String) {
    try {
        val output = openFileOutput("testdata01", 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("testdata01")
        val reader = BufferedReader(InputStreamReader(input))
        reader.use {
            reader.forEachLine {
                content.append(it)
            }
        }
    } catch (e: IOException) {
        e.printStackTrace()
    }
    return content.toString()
}

}

现在需要将testdata01文件存储到公共的内部存储目录,以便在真实的手机内可以找到文件testdata01。 请修改上述代码。注意,需要采用当前最新的、主流的方法,不要采用已过时的、不推荐的方法。

答案:

要将文件存储到公共的内部存储目录,可以使用Context.getExternalFilesDir()方法。这个方法会返回一个表示应用程序的外部文件目录的File对象。这个目录是应用程序专用的,即使在外部存储中,其他应用程序也无法访问。

以下是修改后的代码:

package com.example.activitytest

import android.content.Context
import android.os.Bundle
import android.widget.EditText
import android.widget.Toast
import java.io.*

class FileStoreActivity : BaseActivityClass() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.file_store_layout)
        val inputText = load()
        if (inputText.isNotEmpty()) {
            val editText1: EditText = findViewById(R.id.fileStoreEdit)
            editText1.setText(inputText)
            editText1.setSelection(inputText.length)
            Toast.makeText(this, "Restoring succeeded", Toast.LENGTH_SHORT).show()
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        val editText1: EditText = findViewById(R.id.fileStoreEdit)
        val inputText = editText1.text.toString()
        save(inputText)
    }

    private fun save(inputText: String) {
        try {
            val file = File(getExternalFilesDir(null), "testdata01")
            val writer = BufferedWriter(FileWriter(file))
            writer.use {
                it.write(inputText)
            }
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }

    private fun load(): String {
        val content = StringBuilder()
        try {
            val file = File(getExternalFilesDir(null), "testdata01")
            if (file.exists()) {
                val reader = BufferedReader(FileReader(file))
                reader.use {
                    reader.forEachLine {
                        content.append(it)
                    }
                }
            }
        } catch (e: IOException) {
            e.printStackTrace()
        }
        return content.toString()
    }
}

关键修改点:

  1. 保存文件

    • 使用File(getExternalFilesDir(null), "testdata01")来获取文件对象。
    • 使用BufferedWriterFileWriter来写入文件。
  2. 加载文件

    • 使用File(getExternalFilesDir(null), "testdata01")来获取文件对象。
    • 检查文件是否存在,如果存在则使用BufferedReaderFileReader来读取文件内容。

注意事项:

  • getExternalFilesDir(null)方法返回的目录是应用程序专用的外部存储目录,其他应用程序无法访问。
  • 这个目录在应用程序卸载时会被删除。
  • 需要在AndroidManifest.xml中添加权限声明:
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    
  • 从Android 6.0(API 级别 23)开始,用户需要在运行时授予存储权限。确保在运行时请求这些权限。