
Lightweight library facilitates reading, writing, and modifying ZIP files, offering features like easy extraction, compression, and modification of ZIP entries and metadata.
A lightweight Kotlin Multiplatform library for reading, writing and modifying ZIP files.
The kotlin file I/O interface uses kotlinx-io making it compatible with other Kotlin Multiplatform libraries.
The JVM implementation uses the standard java.util.zip while the current native implementation uses the lightweight kuba--/zip.
Currently kzip supports the following targets:
jvmlinuxX64linuxArm64mingwX64androidNativeX64androidNativeArm64macosX64macosArm64But the following targets are planned (mostly only requiring testing):
More features are planned including support for suspending functions, more access to metadata, more utilities and integrations into other KMP libraries (see also Contributing).
The kzip dependency is available on Maven Central and can be added to your common source set.
Just replace $kzipVersion with the latest version.
implementation("de.jonasbroeckmann.kzip:kzip:$kzipVersion")implementation "de.jonasbroeckmann.kzip:kzip:$kzipVersion"<dependencies>
<dependency>
<groupId>de.jonasbroeckmann.kzip</groupId>
<artifactId>kzip</artifactId>
<version>$kzipVersion</version>
</dependency>
</dependencies>val zip = Zip.open(Path("example.zip"))
// Access a specific entry
zip.entry(Path("content.txt")) {
println("Entry content.txt has size $uncompressedSize")
println("Entry content.txt has content:")
println(readToSource().readString())
}
// Access all entries
zip.forEachEntry { entry ->
println("Entry ${entry.path} has size ${entry.uncompressedSize}")
if (entry.isDirectory) {
println("Entry is a directory")
} else {
println("Entry is a file with content:")
println(entry.readToSource().readString())
}
}
zip.close()Zip.open(Path("example.zip")).use { zip ->
zip.extractTo(Path("example"))
}Zip.open(
path = Path("example.zip"),
mode = Zip.Mode.Write,
// Optional: Set compression level
level = Zip.CompressionLevel.BetterCompression
).use { zip ->
zip.compressFrom(Path("example"))
}val textSource = Buffer().apply { writeString("Hello, World!") }
Zip.open(Path("example.zip"), mode = Zip.Mode.Append).use { zip ->
// Add a folder
zip.folderEntry(Path("subfolder"))
// Add a file from a path
zip.entryFromPath(Path("compressed.txt"), Path("example.txt"))
// Add a file from a source
zip.entryFromSource(Path("hello_world.txt"), textSource)
}
textSource.close()If you have any ideas, feel free to open an issue or create a pull request.
This project is licensed under the MIT License.
A lightweight Kotlin Multiplatform library for reading, writing and modifying ZIP files.
The kotlin file I/O interface uses kotlinx-io making it compatible with other Kotlin Multiplatform libraries.
The JVM implementation uses the standard java.util.zip while the current native implementation uses the lightweight kuba--/zip.
Currently kzip supports the following targets:
jvmlinuxX64linuxArm64mingwX64androidNativeX64androidNativeArm64macosX64macosArm64But the following targets are planned (mostly only requiring testing):
More features are planned including support for suspending functions, more access to metadata, more utilities and integrations into other KMP libraries (see also Contributing).
The kzip dependency is available on Maven Central and can be added to your common source set.
Just replace $kzipVersion with the latest version.
implementation("de.jonasbroeckmann.kzip:kzip:$kzipVersion")implementation "de.jonasbroeckmann.kzip:kzip:$kzipVersion"<dependencies>
<dependency>
<groupId>de.jonasbroeckmann.kzip</groupId>
<artifactId>kzip</artifactId>
<version>$kzipVersion</version>
</dependency>
</dependencies>val zip = Zip.open(Path("example.zip"))
// Access a specific entry
zip.entry(Path("content.txt")) {
println("Entry content.txt has size $uncompressedSize")
println("Entry content.txt has content:")
println(readToSource().readString())
}
// Access all entries
zip.forEachEntry { entry ->
println("Entry ${entry.path} has size ${entry.uncompressedSize}")
if (entry.isDirectory) {
println("Entry is a directory")
} else {
println("Entry is a file with content:")
println(entry.readToSource().readString())
}
}
zip.close()Zip.open(Path("example.zip")).use { zip ->
zip.extractTo(Path("example"))
}Zip.open(
path = Path("example.zip"),
mode = Zip.Mode.Write,
// Optional: Set compression level
level = Zip.CompressionLevel.BetterCompression
).use { zip ->
zip.compressFrom(Path("example"))
}val textSource = Buffer().apply { writeString("Hello, World!") }
Zip.open(Path("example.zip"), mode = Zip.Mode.Append).use { zip ->
// Add a folder
zip.folderEntry(Path("subfolder"))
// Add a file from a path
zip.entryFromPath(Path("compressed.txt"), Path("example.txt"))
// Add a file from a source
zip.entryFromSource(Path("hello_world.txt"), textSource)
}
textSource.close()If you have any ideas, feel free to open an issue or create a pull request.
This project is licensed under the MIT License.