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

Kotlin应用加载XML文件遇FileNotFoundException问题求助

问题分析与解决方案

这个错误的核心原因是你混淆了开发环境中的项目文件路径和Android应用运行时的文件系统路径。在开发电脑上,src/main/res/locations.xml是源码目录的路径,但当应用编译打包并安装到设备后,这个路径完全不存在——Android会把res目录下的资源编译并打包到APK内部,无法通过File类直接访问。

正确的资源访问方式

根据你的xml文件用途,分两种场景处理:

场景1:xml是可编译的应用资源(推荐)

把locations.xml移动到res/xml目录下(如果没有xml目录就新建一个),然后通过Android的Resources API获取输入流来解析:

fun parseToObject(context: Context) { // 需要传入Context来获取Resources
    val thread = Thread(Runnable {
        try {
            // 通过资源ID获取输入流
            val inputStream = context.resources.openRawResource(R.xml.locations)
            val doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(inputStream)
            println("Root Node: " + doc.documentElement.nodeName)
            inputStream.close() // 记得关闭流
        } catch (e: Exception) {
            e.printStackTrace() // 用printStackTrace比只打印message更容易排查问题
        }
    })
    thread.start()
}

场景2:xml是原始未编译文件

如果你的xml不需要被Android编译(比如包含特殊格式或不需要资源ID引用),可以把它放在res/raw目录下,访问方式类似:

val inputStream = context.resources.openRawResource(R.raw.locations)

关键注意点

  • 不要用File类直接访问项目源码路径,设备上的应用文件系统和你的开发项目结构完全独立。
  • 确保Android Studio已经同步了项目(点击工具栏的「Sync Project with Gradle Files」),这样R类才会生成对应的资源ID(R.xml.locations或R.raw.locations)。
  • 如果是在Activity中调用,直接用this作为Context即可;如果在其他类中,需要传入Context实例(注意避免内存泄漏,比如用applicationContext而非Activity实例)。

内容的提问来源于stack exchange,提问作者Quasimodo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:13:42