My favorites | Sign in
Project Home Downloads Wiki Issues Source
Project Information
Members
Featured
Downloads
Links

The snappy-java is a Java port of the snappy, a fast compresser/decompresser written in C++, originally developed by Google.

Features

  • Apache Licence Version 2.0. Free for both commercial and non-commercial use.
  • Fast compression/decompression tailored to 64-bit CPU architecture.
  • JNI-based implementation to achieve comparable performance to the native C++ version.
    • Traditional JNI-based libraries cannot be included in web containers (e.g., war files in Tomcat), but snappy-java has no such a problem because it loads the native code using the root class loader (via native code injection technique), which enables sharing of the native code between child class loaders.
  • Portable across various operating systems; Snappy-java contains native libraries built for Window/Mac/Linux (32/64-bit). At runtime, snappy-java loads one of these libraries according to your machine environment (It looks system properties, os.name and os.arch).
  • Simple usage. Add the snappy-java-(version).jar file to your classpath. Then call compression/decompression methods in org.xerial.snappy.Snappy

Performance

  • Snappy's main target is very high-speed compression/decompression with reasonable compression size. So the compression ratio of snappy-java is modest and about the same as LZF (ranging 20%-100% according to the dataset).

Download

The current stable version 1.0.4.1 is available from Download page.

If you are a Maven user, see #Using_with_Maven

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 API

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: http://code.google.com/p/snappy-java/issues/list

Public discussion forum is here: Xerial Public Discussion Group.

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 Mercurial(hg), JDK (1.6 or higher), Maven (3.x or higher is required), g++ compiler (mingw in Windows) etc.

$ hg clone https://snappy-java.googlecode.com/hg/ snappy-java 
$ cd snappy-java
$ make

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

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 ( Issue 21 ).


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

Powered by Google Project Hosting