Android Studio读取assets文本文件失败,应用崩溃求助
问题描述
在Android Studio项目中创建了assets文件夹,并将文本文件放入其中,但运行应用时出现崩溃,报错信息为:
Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
尝试了多种文件名写法,比如"assets/file.txt"、"assets\file.txt"、"./file.txt",但错误依旧。
我的Kotlin代码如下:
package com.soft23.testfile import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.material.Text import java.io.File class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) var str = "str" var filename = "file.txt" File(filename).forEachLine { str = it } setContent { Text(text = str) } } }
这段代码在IntelliJ IDEA中能正常运行,请问哪里操作错了?
解决方法
错误原因
你用java.io.File类读取assets目录下的文件是完全错误的。Android的assets文件是打包进APK的内部资源,并非设备文件系统中的独立文件,File类无法直接访问APK内部的资源路径。而IntelliJ IDEA中是读取本地文件系统的文件,所以能正常运行。
正确实现
使用Android提供的AssetManager来读取assets资源,修改后的代码如下:
package com.soft23.testfile import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.material.Text import java.io.BufferedReader class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) var str = "str" val filename = "file.txt" try { // 通过assets获取文件输入流 assets.open(filename).use { inputStream -> BufferedReader(inputStream.reader()).use { reader -> // 读取文件全部内容 str = reader.readText() } } } catch (e: Exception) { e.printStackTrace() str = "读取失败: ${e.message}" } setContent { Text(text = str) } } }
注意事项
- 确保assets文件夹位于
src/main目录下,Android Studio才会将其识别为资源目录 - 文件名区分大小写,要和assets文件夹中的文件完全一致
- 如果文件较大,建议将读取操作放在子线程中执行,避免阻塞主线程导致ANR(应用无响应)
内容的提问来源于stack exchange,提问作者Sergei Mazanov
相关产品推荐
相关产品推荐

