View on GitHub

snappy-java

Snappy compressor/decompressor for Java

The snappy-java is a Java port of the snappy http://code.google.com/p/snappy/, a fast C++ compresser/decompresser developed by Google.

Features

Performance

Download

The current stable version is available from here:

  • Release plans
  • Snapshot version (the latest beta version): https://oss.sonatype.org/content/repositories/snapshots/org/xerial/snappy/snappy-java/ If you are a Maven user, see pom.xml example.
  • Usage

    First, import org.xerial.snapy.Snappy in your Java code:

     import org.xerial.snappy.Snappy;
    

    Then use Snappy.compress(byte[]) and Snappy.uncompress(byte[]):

     String input = "Hello snappy-java! Snappy-java is a JNI-based wrapper of "
     + "Snappy, a fast compresser/decompresser.";
     byte[] compressed = Snappy.compress(input.getBytes("UTF-8"));
     byte[] uncompressed = Snappy.uncompress(compressed);
    
     String result = new String(uncompressed, "UTF-8");
     System.out.println(result);
    

    In addition, high-level methods (Snappy.compress(String), Snappy.compress(float[] ..) etc. ) and low-level ones (e.g. Snappy.rawCompress(.. ), Snappy.rawUncompress(..), etc.), which minimize memory copies, can be used. See also Snappy.java

    Stream-based API

    Stream-based compressor/decompressor SnappyOutputStream/SnappyInputStream are also available for reading/writing large data sets.

    Setting classpath

    If you have snappy-java-(VERSION).jar in the current directory, use -classpath option as follows:

    $ javac -classpath ".;snappy-java-(VERSION).jar" Sample.java  # in Windows
    or 
    $ javac -classpath ".:snappy-java-(VERSION).jar" Sample.java  # in Mac or Linux
    

    Using with Maven

    Add the following dependency to your pom.xml:

    <dependency>
      <groupId>org.xerial.snappy</groupId>
      <artifactId>snappy-java</artifactId>
      <version>(version)</version>
      <type>jar</type>
      <scope>compile</scope>
    </dependency>
    

    Public discussion group

    Post bug reports or feature request to the Issue Tracker: https://github.com/xerial/snappy-java/issues

    Public discussion forum is here:

    Building from the source code

    See the installation instruction. Building from the source code is an option when your OS platform and CPU architecture is not supported. To build snappy-java, you need Git, JDK (1.6 or higher), Maven (3.x or higher is required), g++ compiler (mingw in Windows) etc.

    $ git clone https://github.com/xerial/snappy-java.git
    $ cd snappy-java
    $ make
    

    A file target/snappy-java-$(version).jar is the product additionally containing the native library built for your platform.

    Cross-compiling for other platforms

    The Makefile contains rules for cross-compiling the native library for other platforms so that the snappy-java JAR can support multiple platforms. For example, to build the native libraries for x86 Linux, x86 and x86-64 Windows, and soft- and hard-float ARM:

    $ make linux32 win32 win64 linux-arm linux-armhf
    

    If you append snappy to the line above, it will also build the native library for the current platform and then build the snappy-java JAR (containing all native libraries built so far).

    Of course, you must first have the necessary cross-compilers and development libraries installed for each target CPU and OS. For example, on Ubuntu 12.04 for x86-64, install the following packages for each target:

    Unfortunately, cross-compiling for Mac OS X is not currently possible; you must compile within OS X.

    If you are using Mac and openjdk7 (or higher), use the following option:

    $ make native LIBNAME=libsnappyjava.dylib
    

    Miscellaneous Notes

    Using snappy-java with Tomcat 6 (or higher) Web Server

    Simply put the snappy-java's jar to WEB-INF/lib folder of your web application. Usual JNI-library specific problem no longer exists since snappy-java version 1.0.3 or higher can be loaded by multiple class loaders in the same JVM by using native code injection to the parent class loader.


    Snappy-java is developed by Taro L. Saito. Twitter @taroleo