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

Android实现选中文件批量压缩为单个Zip文件的方法

将选中的文件压缩为单个Zip文件

你已经通过以下Kotlin代码获取了设备中的MP4文件列表:

fun getAllDir(dir: File) {
    val listFile = dir.listFiles()
    if (listFile != null) {
        for (i in listFile.indices) {
            if (listFile[i].isDirectory) {
                getAllDir(listFile[i])
            } else {
                if (listFile[i].path.endsWith(".mp4")) {
                    listVideo.add(listFile[i])
                }
            }
        }
    }
}

要将选中的部分文件压缩为单个Zip文件,可以实现一个通用的压缩工具函数,具体操作如下:

实现压缩函数

这个函数接收选中的文件列表和输出Zip文件的路径,完成压缩操作:

import java.io.*
import java.util.zip.ZipEntry
import java.util.zip.ZipOutputStream

fun compressFilesToZip(selectedFiles: List<File>, zipOutputPath: String) {
    // 使用use自动关闭流,避免资源泄漏
    ZipOutputStream(BufferedOutputStream(FileOutputStream(zipOutputPath))).use { zipOut ->
        selectedFiles.forEach { file ->
            // 跳过不存在的文件
            if (!file.exists()) return@forEach
            
            // 创建Zip条目,使用原文件名作为条目名称
            val zipEntry = ZipEntry(file.name)
            zipOut.putNextEntry(zipEntry)
            
            // 读取文件内容并写入Zip输出流
            FileInputStream(file).use { inputStream ->
                val buffer = ByteArray(4096) // 4KB缓冲区提升读写效率
                var bytesRead: Int
                while (inputStream.read(buffer).also { bytesRead = it } != -1) {
                    zipOut.write(buffer, 0, bytesRead)
                }
            }
            zipOut.closeEntry()
        }
    }
}

调用压缩函数

假设你已经通过选中逻辑得到了需要压缩的文件列表(比如从listVideo中筛选),可以这样调用:

// 示例:替换成你的实际选中逻辑
val selectedVideos = listVideo.filter { /* 你的选中判断条件 */ }

// 指定Zip文件输出路径(比如应用私有外部存储目录)
val zipOutputFile = File(getExternalFilesDir(null), "selected_videos.zip")

// 执行压缩
compressFilesToZip(selectedVideos, zipOutputFile.absolutePath)

注意事项

  • 权限处理:如果需要访问外部存储的文件,Android 10及以下需要申请READ_EXTERNAL_STORAGE权限;Android 11+建议使用媒体库API,或申请MANAGE_EXTERNAL_STORAGE权限(需注意权限合规)。
  • 保留目录结构:如果希望解压后保留原文件的目录结构,可以将ZipEntry的名称改为文件相对于扫描根目录的相对路径,例如:
    val rootDir = File("/sdcard/") // 你的扫描根目录
    val relativePath = file.relativeTo(rootDir).path
    val zipEntry = ZipEntry(relativePath)
    

内容的提问来源于stack exchange,提问作者Xuân Đức Nguyễn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:46:08