Kompress
2.2.0indexedCompression and archiver APIs for Kotlin Multiplatform.
Compression and archiver APIs for Kotlin Multiplatform.
Compression and archiver APIs for Kotlin Multiplatform.
First, add the official Maven Central repository to your settings.gradle.kts:
dependencyResolutionManagement {
repositories {
maven("https://central.sonatype.com/repository/maven-snapshots")
mavenCentral()
}
}
Then add a dependency on the library in your root buildscript:
kotlin {
sourceSets {
commonMain {
dependencies {
implementation("dev.karmakrafts.kompress:kompress-core:<version>")
}
}
}
}
Or, if you are only using Kotlin/JVM, add it to your top-level dependencies block instead.
If you just want to (de)compress one large blob of data, the Deflater.compress and Inflater.decompress functions
are what you're probably looking for:
fun main() {
val myData = "Hello, World! This is an important message."
val compressedData = Deflater.compress(
data = myData.encodeToByteArray(), raw = false, // Control if you want the gzip/pkzip header
level = ,
bufferSize =
)
decompressedData = Inflater.decompress(
= compressedData,
raw = ,
bufferSize =
)
println(myData == decompressedData.decodeToString())
}
Streaming compression is what you want if your data exceeds a certain size,
that size usually being the limit of the underlying runtime's array size.
With Kompress, that limit is about 2.147GB because the index type of an array
in Kotlin is a signed integer.
Streaming allows you to split up the data into discrete chunks and compress those
chunks sequentially until you processed all the data.
You can either use the Deflater and Inflater interfaces from the core module manually:
fun main() {
val deflater = Deflater(
raw = false,
level = 9,
// ...
)
val outputBuffer = ByteArray(1024)
while (deflater.needsInput) {
if (!hasMoreInput) deflater.finish() // Signal that we are done compressing
deflater.input = getInputChunk()
(!deflater.finished) {
deflater.compress(outputBuffer)
copyChunkToSomeTarget(outputBuffer)
}
}
deflater.close()
}
Or you can use the recommended way of using kotlinx.io wrappers:
fun main() {
val buffer = Buffer()
buffer.writeInt(42)
buffer.writeFloat(4.20F)
val compressedBuffer = Buffer()
buffer.deflatingSource().use(compressedBuffer::transferFrom)
val decompressedBuffer = Buffer()
compressedBuffer.inflatingSource().use(decompressedBuffer::transferFrom)
}
Compressor and Decompressor APIs for modeling streaming compressorsArchiver<E> and Unarchiver<E> APIs for modeling streaming archiversInflater/Deflater APIsSurfaced from shared tags and platforms — no rankings paid for.