You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 11:15:26