fun unZip(zipFile: String, context: Context) {
var outputStream: OutputStream? = null
var inputStream: InputStream? = null
try {
val zf = ZipFile(zipFile)
val entries = zf.entries()
while (entries.hasMoreElements()) {
val zipEntry: ZipEntry = entries.nextElement()
val zipEntryName = zipEntry.name
inputStream = zf.getInputStream(zipEntry)
//拦截macos的压缩文件解压时会生成的__MACOSX开头目录/文件
if (zipEntryName.startsWith("__MACOSX")) {
continue
}
if (zipEntry.isDirectory) {
val descFolder = if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) {
File(context.filesDir,zipEntryName)
} else {
File(context.getExternalFilesDir(""), zipEntryName)
}
if (!descFolder.exists()) {
descFolder.mkdirs()
}
} else {
val descPath = if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) {
context.filesDir.absolutePath + File.separator + zipEntryName
} else {
context.getExternalFilesDir("")?.absolutePath + File.separator + zipEntryName
}
val descFile = File(descPath)
descFile.createNewFile()
writeStreamToFile(inputStream,descFile)
}
inputStream?.close()
outputStream?.close()
}
} finally {
inputStream?.close()
outputStream?.close()
}
}
private fun writeStreamToFile(stream: InputStream, file: File) {
try {
val fos = FileOutputStream(file)
val buffer = ByteArray(1024)
var len: Int
var total = 0
while ((stream.read(buffer).also { len = it }) != -1) {
fos.write(buffer, 0, len)
total += len
}
fos.flush()
fos.close()
stream.close()
} catch (e1: Exception) {
e1.printStackTrace()
}
}