Android读取assets文件夹内.tar.gz文件报找不到异常的解决方法
Android读取assets文件报错的解决方法
核心错误点
- 路径前缀错误:
AssetManager.open()不需要添加file:///android_asset/前缀,直接传入assets目录下的文件名即可。这个前缀是给WebView等组件使用的,AssetManager本身已指向assets目录,加前缀会导致路径无效,触发文件未找到异常。 - 输出路径为空:
outfilename是空字符串,FileOutputStream无法写入空路径,必须指定一个应用有权限写入的路径(比如应用内部存储的files目录)。 - 流管理不规范:手动关闭流容易遗漏,建议用Kotlin的
use函数自动管理流的生命周期,避免资源泄漏。
修正后的代码
@Throws(IOException::class) private fun copydatabase(fileName: String) { // 直接传入assets下的文件名,无需额外前缀 assetManager.open(fileName).use { myinput -> BufferedInputStream(myinput).use { buffStream -> GZIPInputStream(buffStream).use { zis -> // 指定输出路径:应用内部存储的files目录下生成解压文件 val outFilePath = filesDir.absolutePath + "/extracted_${fileName}" FileOutputStream(outFilePath).use { myoutput -> val buffer = ByteArray(1024) var length: Int while (zis.read(buffer).also { length = it } > 0) { myoutput.write(buffer, 0, length) } myoutput.flush() } } } } }
调用示例
读取assets里的R2.tar.gz时,直接调用:
copydatabase("R2.tar.gz")
额外注意事项
- 确保assets目录下确实存在
R2.tar.gz文件,且文件名大小写完全匹配(Android的assets目录文件名区分大小写)。 - 如果项目是模块化结构,确认assets文件放在主模块的assets目录下,或已正确配置模块间的资源访问规则。
内容的提问来源于stack exchange,提问作者MARSH
相关产品推荐
相关产品推荐

