Created
April 16, 2022 17:43
-
-
Save hector6872/192177cab88d7945e8cfc4ffefcc66d4 to your computer and use it in GitHub Desktop.
Zip/Unzip functions in Kotlin
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
object ZipManager { | |
fun zip(files: List<String>, outputStream: OutputStream): Boolean = try { | |
ZipOutputStream(BufferedOutputStream(outputStream)).use { stream -> | |
for (file in files) { | |
BufferedInputStream(FileInputStream(File(file))).use { origin -> | |
stream.putNextEntry(ZipEntry(file.substring(file.lastIndexOf("/") + 1))) | |
origin.copyTo(stream) | |
} | |
} | |
} | |
true | |
} catch (ignored: Exception) { | |
false | |
} | |
fun unzip(inputStream: InputStream, destination: String): Boolean = try { | |
File(destination).let { file -> file.isDirectory.ifFalse { file.mkdirs() } } | |
ZipInputStream(BufferedInputStream(inputStream)).use { stream -> | |
stream.asIterable().forEach { zipEntry -> | |
val path = "$destination${if (destination.endsWith(File.separator)) "" else File.separator}${zipEntry.name}" | |
when { | |
zipEntry.isDirectory -> File(path).let { file -> file.isDirectory.ifFalse(file::mkdirs) } | |
else -> BufferedOutputStream(FileOutputStream(path)).use { outputStream -> stream.copyTo(outputStream) } | |
} | |
} | |
} | |
true | |
} catch (ignored: Exception) { | |
false | |
} | |
fun list(inputStream: InputStream): List<String> = try { | |
ZipInputStream(inputStream).use { stream -> stream.asIterable().map { zipEntry -> zipEntry.name } } | |
} catch (ignored: Exception) { | |
listOf() | |
} | |
} | |
private fun ZipInputStream.asIterable(): Iterable<ZipEntry> = object : Iterable<ZipEntry> { | |
override fun iterator(): Iterator<ZipEntry> = ZipIterator(this@asIterable) | |
} | |
private class ZipIterator(private val stream: ZipInputStream) : Iterator<ZipEntry> { | |
private var next: ZipEntry? = null | |
override fun hasNext(): Boolean { | |
next = stream.nextEntry | |
return next != null | |
} | |
override fun next(): ZipEntry = next ?: throw NoSuchElementException() | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment