diff --git a/build.gradle.kts b/build.gradle.kts index 9fbea65..18d8444 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -108,6 +108,8 @@ dependencies { // https://github.com/lz4/lz4-java compileOnly("org.lz4:lz4-java:1.8.0") // for xxHash, optional + compileOnly("org.tukaani:xz:1.9") // LZMA support, optional + testImplementation("io.netty:netty-buffer:4.1.96.Final") testImplementation("com.esotericsoftware:kryo:5.5.0") testImplementation("org.lz4:lz4-java:1.8.0") diff --git a/src/dorkbox/bytes/LZMA.kt b/src/dorkbox/bytes/LZMA.kt new file mode 100644 index 0000000..00c0e68 --- /dev/null +++ b/src/dorkbox/bytes/LZMA.kt @@ -0,0 +1,59 @@ +/* + * Copyright 2023 dorkbox, llc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package dorkbox.bytes + +import java.io.ByteArrayOutputStream +import java.io.IOException +import java.io.InputStream +import java.io.OutputStream + +object LZMA { + // https://tukaani.org/xz/java.html + + init { + try { + Class.forName("org.tukaani.xz.LZMAOutputStream") + } + catch (e: Exception) { + System.err.println("Please add the LZMA library to your classpath, for example: implementation(\"org.tukaani:xz:1.9\")") + throw e + } + } + + /** + * Gets the version number. + */ + val version = BytesInfo.version + + @Throws(IOException::class) + fun encode(input: InputStream, output: OutputStream) { + org.tukaani.xz.LZMAOutputStream(output, org.tukaani.xz.LZMA2Options(3), true).use { compressionStream -> + input.copyTo(compressionStream) + } + } + + @Throws(IOException::class) + fun decode(input: InputStream): ByteArrayOutputStream { + val byteArrayOutputStream = ByteArrayOutputStream(8192) + org.tukaani.xz.LZMAInputStream(input).use { compressedStream -> compressedStream.copyTo(byteArrayOutputStream) } + return byteArrayOutputStream + } + + @Throws(IOException::class) + fun decode(input: InputStream, output: OutputStream) { + org.tukaani.xz.LZMAInputStream(input).use { compressedStream -> compressedStream.copyTo(output) } + } +}