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
相关产品推荐
相关产品推荐

