Snappy compressor/decompressor for Java
Go to file
Bradford Powell c2260cf38d Throw ExceptionInInitializerError rather than just printing stacktrace
to stderr if the native libraries cannot be loaded. Because Errors are
not checked exceptions, added to the javadoc to point out that static
initialization of Snappy can throw this Error.
2012-09-06 21:01:56 -05: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 Throw ExceptionInInitializerError rather than just printing stacktrace 2012-09-06 21:01:56 -05: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 Add milestone 2012-09-06 10:44:19 +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 Added cross-compiling instructions to README.md 2012-09-06 19:16:57 -05:00
googlecode_upload.py Add google code upload script 2011-10-05 11:05:21 +09:00
pom.xml Disable pushing changes to repo when releasing. This fix is for using git-flow with maven release plugin 2012-09-06 12:57:03 +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:

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.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.

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