/Brotli4j

Brotli4j provides Brotli compression and decompression for Java. (Huanshanekji's fork)

Primary LanguageJavaApache License 2.0Apache-2.0

Brotli4j

Maven Central

Brotli4j provides Brotli compression and decompression for Java.

Supported Platforms:

Windows (Windows Server 2022) x64
Linux (CentOS 6) x64
Linux (CentOS 6) Aarch64
macOS (Catalina) x64
macOS (Catalina) Aarch64 (Apple Silicon: M1)

*Install Microsoft Visual C++ Redistributable before running this library on Windows

Download

Maven

For maven, the natives will import automatically by your system family and architecture.

<dependency>
    <groupId>com.aayushatharva.brotli4j</groupId>
    <artifactId>brotli4j</artifactId>
    <version>1.8.0</version>
</dependency>

Gradle

For gradle, we have to write some logic to import native automatically. Of course, you can add native(s) as dependency manually also.

Kotlin DSL

val brotliVersion = "1.8.0"
val operatingSystem: OperatingSystem = DefaultNativePlatform.getCurrentOperatingSystem()

repositories {
    mavenCentral()
}

dependencies {
    implementation("com.aayushatharva.brotli4j:brotli4j:$brotliVersion")
    implementation(
        "com.aayushatharva.brotli4j:native-${
            if (operatingSystem.isWindows) "windows-x86_64"
            else if (operatingSystem.isMacOsX)
                if (DefaultNativePlatform.getCurrentArchitecture().isArm) "osx-aarch64"
                else "osx-x86_64"
            else if (operatingSystem.isLinux)
                if (DefaultNativePlatform.getCurrentArchitecture().isArm) "linux-aarch64"
                else "linux-x86_64"
            else ""
        }:$brotliVersion"
    )
}

Groovy

def brotliVersion = "1.8.0"
def operatingSystem = DefaultNativePlatform.getCurrentOperatingSystem()

repositories {
    mavenCentral()
}

dependencies {
    implementation "com.aayushatharva.brotli4j:brotli4j:$brotliVersion"
    implementation("com.aayushatharva.brotli4j:native-${
        if (operatingSystem.isWindows()) "windows-x86_64"
        else if (operatingSystem.isMacOsX())
            if (DefaultNativePlatform.getCurrentArchitecture().isArm()) "osx-aarch64"
            else "osx-x86_64"
        else if (operatingSystem.isLinux())
            if (DefaultNativePlatform.getCurrentArchitecture().isArm()) "linux-aarch64"
            else "linux-x86_64"
    }:$brotliVersion")
}

Usage

Loading native library:

Call Brotli4jLoader.ensureAvailability() in your application once before using Brotli4j.

Direct API

public class Example {
    public static void main(String[] args) {
        // Load the native library
        Brotli4jLoader.ensureAvailability();

        // Compress data and get output in byte array
        byte[] compressed = Encoder.compress("Meow".getBytes());

        // Decompress data and get output in DirectDecompress
        DirectDecompress directDecompress = Decoder.decompress(compressed); // or DirectDecompress.decompress(compressed);

        if (directDecompress.getResultStatus() == DecoderJNI.Status.DONE) {
            System.out.println("Decompression Successful: " + new String(directDecompress.getDecompressedData()));
        } else {
            System.out.println("Some Error Occurred While Decompressing");
        }
    }
}

Compressing a stream:

public class Example {
    public static void main(String[] args) {
        // Load the native library
        Brotli4jLoader.ensureAvailability();

        FileInputStream inFile = new FileInputStream(filePath);
        FileOutputStream outFile = new FileOutputStream(filePath + ".br");

        Encoder.Parameters params = new Encoder.Parameters().setQuality(4);

        BrotliOutputStream brotliOutputStream = new BrotliOutputStream(outFile, params);

        int read = inFile.read();
        while (read > -1) {
            brotliOutputStream.write(read);
            read = inFile.read();
        }

        // Close the BrotliOutputStream. This also closes the FileOutputStream.
        brotliOutputStream.close();
        inFile.close();
    }
}

Decompressing a stream:

public class Example {
    public static void main(String[] args) {
        // Load the native library
        Brotli4jLoader.ensureAvailability();

        FileInputStream inFile = new FileInputStream(filePath);
        FileOutputStream outFile = new FileOutputStream(decodedfilePath);

        BrotliInputStream brotliInputStream = new BrotliInputStream(inFile);

        int read = brotliInputStream.read();
        while (read > -1) {
            outFile.write(read);
            read = brotliInputStream.read();
        }

        // Close the BrotliInputStream. This also closes the FileInputStream.
        brotliInputStream.close();
        outFile.close();
    }
}

Sponsors

JProfiler is supporting Brotli4J with its full-featured Java Profiler. JProfiler's intuitive UI helps you resolve performance bottlenecks, pin down memory leaks and understand threading issues. Click below to know more:

File Management