Snappy compressor/decompressor for Java
Go to file
Taro L. Saito 53e8605950 Update Milestone.md 2012-09-27 12:52:18 +09:00
.settings add SnappyException/SnappyError 2011-03-30 15:26:53 +09:00
lib Upgrade to snappy-1.0.5. Support building in Max OS X Lion 2012-05-25 10:23:26 +09:00
src Fixes issue #6 2012-09-27 11:09:32 +09:00
.gitignore Add .gitignore 2012-09-06 10:29:58 +09:00
INSTALL Fixes issue 26. Add note on using configuration file and license of the embedded libstdc++ library (GCC Runtime Library Exception) 2011-08-23 12:05:19 +09:00
LICENSE add license notes 2011-03-30 18:17:16 +09:00
Makefile Added win64 cross-compile target to makefile 2012-09-06 19:15:12 -05:00
Makefile.common Added win64 cross-compile target to makefile 2012-09-06 19:15:12 -05:00
Makefile.package Add google code upload script 2011-10-05 11:05:21 +09:00
Milestone.md Update Milestone.md 2012-09-27 12:52:18 +09:00
NOTICE Fixes issue 26. Add note on using configuration file and license of the embedded libstdc++ library (GCC Runtime Library Exception) 2011-08-23 12:05:19 +09:00
README.md Update README.md 2012-09-27 12:51:08 +09:00
googlecode_upload.py Add google code upload script 2011-10-05 11:05:21 +09:00
pom.xml Milestone release 1.0.5-M2 2012-09-27 11:13:14 +09:00
stylesheet.css Fixes issue 29 Javadoc 2011-09-22 16:39:51 +09:00

README.md

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

  • Apache License 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.
    • Although snappy-java uses JNI, it can be used safely with multiple class loaders (e.g. Tomcat, etc.).
  • 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

Download

The current stable version is available from here:

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: <http://groups.google.com/group/xerial?hl=en 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 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:

  • linux32: sudo apt-get install g++-multilib libc6-dev-i386 lib32stdc++6
  • win32: sudo apt-get install g++-mingw-w64-i686
  • win64: sudo apt-get install g++-mingw-w64-x86-64
  • arm: sudo apt-get install g++-arm-linux-gnueabi
  • armhf: sudo apt-get install g++-arm-linux-gnueabihf

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


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