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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 17:54:55