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
相关产品推荐
相关产品推荐

