在Kotlin中如何读写Android中的txt文件

23

我在Kotlin和Android Studio方面仍然是一个初学者。我可以访问大多数Android小部件,但我无法访问文件,到目前为止我只发现了以下代码,它不起作用。应用程序崩溃...

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

如果我也能知道如何在特定位置创建文件,比如在根目录、内部存储器或内部存储器中的一个文件中,我将不胜感激。 谢谢。

5个回答

44

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

内部存储:

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”可能不存在的情况下,你必须在其中使用调用.mkdir()。此外,对于写入,他可以直接使用file.appendText(最终解析为类似于您编写的内容,但是appendText将字符集设置为UTF8)。 - Les
1
你使用 android.content.Context 吗? - TpoM6oH
3
如果您在一个活动中,只需调用getFilesDir()方法,否则您需要获取一个上下文对象。在片段中,您可以调用 getContext().getFilesDir() 方法。 - TpoM6oH
我使用Environment.getExternalStorageDirectory().getPath()成功获取了内部存储路径,并使用File(filePath//这是内部存储路径,"/LET/HelloWorld.txt")分配了文件。但我无法对其进行写入。 应用程序崩溃。 我尝试使用writeText和appendText进行写入,但我找不到如何创建文件的方法。 当我检查存储时,没有文件夹或文件被创建,并且在两者上应用程序都会崩溃... - Khayyam
2
没有任何文档解释为什么需要上下文,或者它应该来自哪里。我们是否应该在特定的地方访问(或不访问)内部存储?似乎应该能够随时写入该目录。 - Theo Bendixson
显示剩余5条评论

26

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

非常感谢!终于找到了一个简洁明了的Kotlin答案,可以读写.txt文件。再次感谢 :) - Rohit Kumar
那么在使用writeText或readText扩展后,我们不需要关闭流吗? - Hamza Khan

9
我只想补充一下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是什么?你要写入文件的字符串吗? - Branson Camp
@BransonCamp 是的。响应是写入文件的数据。 - Mallikarjun M
3
在API级别29中,"getExternalStorageDirectory"方法已被弃用,应使用更新的方法。详情请参考此链接:https://dev59.com/LFMI5IYBdhLWcg3wFXWg - Đốc.tc
如何编写文件列表?我们可以将上述代码放入for循环中并执行,直到要编写的文件数为止吗? - mad_lad
@MADLAD 是的,你可以使用 for 循环来迭代 N 个文件。 - Mallikarjun M
但这不应该在主线程上完成。有什么好的解决方案,协程? - pigswig

2

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")

0
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 
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接