Android Kotlin读取Assets目录文件时assets.open未解析如何解决
报错原因
assets.open()报未解析的核心原因是调用该方法的位置没有持有Android Context上下文实例:
Java代码中使用的getAssets()本质是调用当前Activity、Service等Context子类的系统方法,Kotlin中直接写assets等价于this.assets,只有当前类是Context子类时才能直接这么调用,非Context类或者Fragment中直接调用就会报未解析错误。
正确实现方案
1. 在Activity、Service等Context子类中调用
直接使用当前上下文的assets属性即可,推荐用Kotlin的use扩展函数自动关闭流,避免内存泄漏:
// MainActivity内的伴生对象定义示例 companion object { var mainTable: Array<Array<Any?>?>? = null } // 读取逻辑写在Activity生命周期方法中即可 try { assets.open("maindata.conv").use { inputStream -> ObjectInputStream(inputStream).use { objInStream -> mainTable = objInStream.readObject() as? Array<Array<Any?>?> } } } catch (e: Exception) { // 处理文件不存在、序列化不匹配等异常 e.printStackTrace() }
2. 在非Context类(比如工具类)中调用
需要传入Context实例才能获取AssetsManager:
fun loadMainTable(context: Context): Array<Array<Any?>?>? { return try { context.assets.open("maindata.conv").use { inputStream -> ObjectInputStream(inputStream).use { objInStream -> objInStream.readObject() as? Array<Array<Any?>?> } } } catch (e: Exception) { e.printStackTrace() null } } // 调用时从Activity/Fragment传入上下文 MainActivity.mainTable = loadMainTable(this@MainActivity)
额外注意点
- 文件名大小写要完全匹配,你本地存储的文件名为
maindata.conv,示例代码里的maindata.Conv大小写不一致,Android文件系统对大小写敏感,此处拼写错误也会导致读取失败。 - 类型转换用
as?安全转换,避免序列化结构不匹配时直接抛出类型转换异常,返回null更方便后续做异常兼容。 - 如果在Fragment中调用该逻辑,需要通过
requireContext().assets获取AssetsManager实例,不能直接调用assets。
内容的提问来源于stack exchange,提问作者neelshenning
相关产品推荐
相关产品推荐

