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

遍历ZipFile条目时触发Fatal signal 7 (SIGBUS)错误的排查

错误原因及解决方法

错误原因

你同时对同一个文件开启了读和写操作:ZipFile打开原文件用于读取,同时FileOutputStream直接打开该文件进行写入(会立即覆盖原文件内容)。这会导致原Zip文件的结构被破坏,ZipFile在读取条目时无法找到有效数据,触发底层内存访问错误(SIGBUS)。

解决方法

绝对不能同时读写同一个文件,必须先读取原Zip的所有内容到临时位置(内存或临时文件),处理完成后再覆盖原文件。以下是修正后的代码示例:

val filePath = fileAsset.file.absolutePath
val originalFile = File(filePath)
val tempFile = File.createTempFile("temp_zip", ".zip")

withContext(Dispatchers.IO) {
    // 1. 读取原Zip内容并处理,写入临时文件
    ZipFile(originalFile).use { zipFile ->
        ZipOutputStream(FileOutputStream(tempFile)).use { zos ->
            val entries = zipFile.entries()
            while (entries.hasMoreElements()) {
                val entryIn = entries.nextElement()
                // 在这里添加你的条目修改逻辑(比如修改entry的名称、内容等)
                val newEntry = ZipEntry(entryIn.name)
                // 复制原条目的属性(如修改时间、权限等)
                newEntry.time = entryIn.time
                newEntry.method = entryIn.method
                
                zos.putNextEntry(newEntry)
                // 复制原条目内容到输出流,若要修改内容可在此处处理
                zipFile.getInputStream(entryIn).copyTo(zos)
                zos.closeEntry()
            }
        }
    }

    // 2. 用临时文件替换原文件
    tempFile.copyTo(originalFile, overwrite = true)
    tempFile.delete()
}

关键注意点

  • 使用use函数自动关闭ZipFile、ZipOutputStream等资源,避免资源泄漏。
  • 先将修改后的Zip内容写入临时文件,确保原文件在读取过程中不会被破坏。
  • 处理完成后再用临时文件覆盖原文件,保证操作的原子性(避免中途崩溃导致原文件损坏)。

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

相关产品推荐
方舟 Agent Plan

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

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