【问题标题】:How to read and write txt files in android in kotlin如何在kotlin的android中读写txt文件
【发布时间】:2026-01-09 12:25:01
【问题描述】:

我仍然是 kotlin 和 android studio 的初学者。 我可以访问大多数 android 小部件,但我无法访问文件,到目前为止,我只遇到了以下不起作用的代码。应用崩溃...

var recordsFile = File("/LET/Records.txt")
recordsFile.appendText("record goes here")

如果我也知道如何在特定位置创建文件,将不胜感激。就像在根目录或内部存储或内部存储中的文件中一样。 谢谢..

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    您需要为您的文件使用内部或外部存储目录。

    内部:

    val path = context.getFilesDir()
    

    外部:

    val path = context.getExternalFilesDir(null)
    

    如果您想使用外部存储,您需要向清单添加权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    

    创建你的目录:

    val letDirectory = File(path, "LET")
    letDirectory.mkdirs()
    

    然后创建你的文件:

    val file = File(letDirectory, "Records.txt")
    

    然后你可以写它:

    FileOutputStream(file).use {
        it.write("record goes here".getBytes())
    }
    

    或者只是

    file.appendText("record goes here")
    

    然后阅读:

    val inputAsString = FileInputStream(file).bufferedReader().use { it.readText() }
    

    【讨论】:

    • 我认为在“/LET”可能尚不存在的情况下,您必须在某处使用对 .mkdirs() 的调用。此外,对于写作,他可以​​只使用 file.appendText (最终解析为类似于您所写的内容,除了 appendText 将字符集设置为 UTF8)
    • 你使用android.content.Context吗?
    • 如果你在一个活动中,你可以直接调用getFilesDir(),否则你需要获取一个上下文对象。在片段中你可以调用getContext().getFilesDir()
    • 我设法使用环境获取内部存储路径。 getExternalStorageDirectory().getPath() 并使用 File(filePath//which is the internal storage path , "/LET/HelloWorld.txt") 分配文件但我无法写入它。应用程序崩溃。我尝试了 writeText 和 appendText ......我找不到如何创建文件。当我检查存储时,没有创建任何文件夹或文件,并且应用程序在两者上都崩溃了......
    • 没有任何文档解释你为什么需要上下文,或者它应该来自哪里。是否有某些地方我们应该访问(或不访问)内部存储?似乎应该能够随时写入该目录
    【解决方案2】:

    Kotlin 使文件读/写变得非常简单。

    用于读取/写入内部存储:

    context.openFileOutput(filename, Context.MODE_PRIVATE).use {
        it.write(message.toByteArray())
    }
    .
    .
    .
    val file = File(context.filesDir, "myfile.txt")
    val contents = file.readText() // Read file
    

    用于读取/写入外部存储:

    val file = File(Environment.getExternalStorageDirectory()+"/path/to/myfile.txt")
    file.writeText("This will be written to the file!")
    .
    .
    .
    val contents = file.readText() // Read file
    

    【讨论】:

    • 非常感谢!最后是关于读写 .txt 文件的一个很好的 Kotlin 答案。再次感谢:)
    【解决方案3】:

    我只想补充 TpoM6oH 的答案。使用文件时,您可能无法保证 100% 成功地执行您想要的文件操作。因此,尝试捕获诸如 filenotfoundexception 等异常并适当注意程序控制流程是一种更好的做法。

    要在Android 的外部存储中创建文件,您可以使用

    Environment.getExternalStorageDirectory()
    

    并检查该位置是否存在。如果没有,请创建一个并使用Kotlin继续创建和写入您的文件

    val sd_main = File(Environment.getExternalStorageDirectory()+"/yourlocation")
    var success = true
    if (!sd_main.exists())
        success = sd_main.mkdir()
    
    if (success) {
        val sd = File("filename.txt")
    
        if (!sd.exists())
            success = sd.mkdir()
    
        if (success) {
            // directory exists or already created
            val dest = File(sd, file_name)
            try {
                // response is the data written to file
                PrintWriter(dest).use { out -> out.println(response) }
            } catch (e: Exception) {
                // handle the exception
            }
        }
    } else {
        // directory creation is not successful
    }
    

    希望这会有所帮助。

    【讨论】:

    • 什么是response?您要写入文件的字符串?
    • @BransonCamp 是的。 response 是写入文件的数据
    • getExternalStorageDirectory 在 API 级别 29 java 中已弃用。在这里更新*.com/questions/57116335/…
    • 如何写文件列表?能不能把上面的代码放到for循环中,一直执行到要写入的文件数?
    • @MADLAD 是的,您可以使用 for 循环迭代 N 个文件
    【解决方案4】:

    5行:如果不存在则创建文件到内部目录,写入文件,读取文件

    val file = File(ctx.filesDir, FILE_NAME)
    file.createNewFile()
    file.appendText("record goes here")
    val readResult = FileInputStream(file).bufferedReader().use { it.readText() }
    println("readResult=$readResult")
    

    【讨论】:

      【解决方案5】:
      fun loadWords(context: Context): ArrayList<String> {
              
          val Word = ArrayList<String>()
              var line: String
              var word = ""
              var weight = 0
              try {
                  val reader: BufferedReader
                  val file = context.assets.open("spam_keywords.txt")
                  reader = BufferedReader(InputStreamReader(file))
                  while ((reader.readLine()) != null) {
                      line = reader.readLine()
                      val st = StringTokenizer(line)
                      while (st.hasMoreElements()) {
                          word = st.nextElement().toString()
                      }
                      Word.add(word)
                  }
              } catch (e: Exception) {
                  e.printStackTrace()
              }
              println(Word)
              return Word 
          }
      

      【讨论】: