2017-01-20 09:31:59 +01:00
snappy-java [![Build Status ](https://travis-ci.org/xerial/snappy-java.svg?branch=master )](https://travis-ci.org/xerial/snappy-java) [![Maven Central ](https://maven-badges.herokuapp.com/maven-central/org.xerial.snappy/snappy-java/badge.svg )](https://maven-badges.herokuapp.com/maven-central/org.xerial.snappy/snappy-java/) [![Javadoc ](https://javadoc-emblem.rhcloud.com/doc/org.xerial.snappy/snappy-java/badge.svg )](http://www.javadoc.io/doc/org.xerial.snappy/snappy-java)
2017-01-20 08:29:17 +01:00
===
snappy-java is a Java port of the snappy
2012-09-06 03:36:03 +02:00
< http: / / code . google . com / p / snappy / > , a fast C++ compresser/decompresser developed by Google.
2015-12-02 12:37:02 +01:00
## Features
2014-12-26 03:17:12 +01:00
* Fast compression/decompression around 200~400MB/sec.
2015-12-02 12:37:02 +01:00
* Less memory usage. SnappyOutputStream uses only 32KB+ in default.
2017-01-23 15:04:10 +01:00
* JNI-based implementation to achieve comparable performance to the native C++ version.
2014-07-18 22:14:29 +02:00
* Although snappy-java uses JNI, it can be used safely with multiple class loaders (e.g. Tomcat, etc.).
2014-12-26 03:17:12 +01:00
* Compression/decompression of Java primitive arrays (`float[]`, `double[]` , `int[]` , `short[]` , `long[]` , etc.)
2017-01-23 15:04:10 +01:00
* To improve the compression ratios of these arrays, you can use a fast data-rearrangement implementation ([`BitShuffle`](https://github.com/kiyo-masui/bitshuffle)) before compression
2015-12-02 12:37:02 +01:00
* Portable across various operating systems; Snappy-java contains native libraries built for Window/Mac/Linux (64-bit). 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` .
* [Framing-format support ](https://github.com/google/snappy/blob/master/framing_format.txt ) (Since 1.1.0 version)
2013-11-07 16:20:29 +01:00
* OSGi support
2013-10-21 05:10:19 +02:00
* [Apache License Version 2.0 ](http://www.apache.org/licenses/LICENSE-2.0 ). Free for both commercial and non-commercial use.
2012-09-06 03:36:03 +02:00
2015-12-02 12:37:02 +01:00
## Performance
2012-09-06 03:36:03 +02:00
* 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).
2012-09-06 03:44:09 +02:00
* Here are some [benchmark results ](https://github.com/ning/jvm-compressor-benchmark/wiki ), comparing
2012-09-06 03:36:03 +02:00
snappy-java and the other compressors
2015-12-02 12:37:02 +01:00
`LZO-java` /`LZF`/`QuickLZ`/`Gzip`/`Bzip2`. Thanks [Tatu Saloranta @cotowncoder ](http://twitter.com/#!/cowtowncoder ) for providing the benchmark suite.
2014-11-01 09:14:58 +01:00
* The benchmark result indicates snappy-java is the fastest compreesor/decompressor in Java: http://ning.github.com/jvm-compressor-benchmark/results/canterbury-roundtrip-2011-07-28/index.html
* The decompression speed is twice as fast as the others: http://ning.github.com/jvm-compressor-benchmark/results/canterbury-uncompress-2011-07-28/index.html
2012-09-06 03:36:03 +02:00
2015-12-02 12:37:02 +01:00
## Download
2013-10-17 07:41:58 +02:00
2015-12-02 12:37:02 +01:00
* [Release Notes ](Milestone.md )
2013-10-17 07:41:58 +02:00
2012-09-06 03:44:09 +02:00
The current stable version is available from here:
2014-06-12 04:02:08 +02:00
* Release version: http://central.maven.org/maven2/org/xerial/snappy/snappy-java/
2012-09-07 04:32:37 +02:00
* Snapshot version (the latest beta version): https://oss.sonatype.org/content/repositories/snapshots/org/xerial/snappy/snappy-java/
2013-10-17 04:16:44 +02:00
2014-11-01 09:12:41 +01:00
### Using with Maven
* Snappy-java is available from Maven's central repository: < http: // central . maven . org / maven2 / org / xerial / snappy / snappy-java >
Add the following dependency to your pom.xml:
< dependency >
< groupId > org.xerial.snappy< / groupId >
< artifactId > snappy-java< / artifactId >
2017-01-23 15:04:10 +01:00
< version > 1.1.3-M1< / version >
2014-11-01 09:12:41 +01:00
< type > jar< / type >
< scope > compile< / scope >
< / dependency >
### Using with sbt
```
2017-01-23 15:04:10 +01:00
libraryDependencies += "org.xerial.snappy" % "snappy-java" % "1.1.3-M1"
2014-11-01 09:12:41 +01:00
```
2012-09-06 03:36:03 +02:00
2015-12-02 12:37:02 +01:00
## Usage
2012-09-06 03:36:03 +02:00
First, import `org.xerial.snapy.Snappy` in your Java code:
2013-03-28 09:34:29 +01:00
```java
import org.xerial.snappy.Snappy;
```
2012-09-06 03:36:03 +02:00
Then use `Snappy.compress(byte[])` and `Snappy.uncompress(byte[])` :
2013-03-28 09:34:29 +01:00
```java
String input = "Hello snappy-java! Snappy-java is a JNI-based wrapper of "
2012-09-06 03:36:03 +02:00
+ "Snappy, a fast compresser/decompresser.";
2013-03-28 09:34:29 +01:00
byte[] compressed = Snappy.compress(input.getBytes("UTF-8"));
byte[] uncompressed = Snappy.uncompress(compressed);
2015-12-02 12:37:02 +01:00
2013-03-28 09:34:29 +01:00
String result = new String(uncompressed, "UTF-8");
System.out.println(result);
```
2012-09-06 03:36:03 +02:00
2015-12-02 12:37:02 +01:00
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.
2012-09-06 03:36:03 +02:00
### Stream-based API
2015-12-02 12:37:02 +01:00
Stream-based compressor/decompressor `SnappyOutputStream` /`SnappyInputStream` are also available for reading/writing large data sets. `SnappyFramedOutputStream` /`SnappyFramedInputStream` can be used for the [framing format ](https://github.com/google/snappy/blob/master/framing_format.txt ).
2012-09-06 03:36:03 +02:00
2017-01-23 15:04:10 +01:00
* See also [Javadoc API ](https://oss.sonatype.org/service/local/repositories/releases/archive/org/xerial/snappy/snappy-java/1.1.3-M1/snappy-java-1.1.3-M1-javadoc.jar/!/index.html )
2013-03-19 16:10:02 +01:00
2014-12-26 03:17:12 +01:00
#### Compatibility Notes
2016-06-30 23:03:31 +02:00
* `SnappyOutputStream` and `SnappyInputStream` use `[magic header:16 bytes]([block size:int32][compressed data:byte array])*` format. You can read the result of `Snappy.compress` with `SnappyInputStream` , but you cannot read the compressed data generated by `SnappyOutputStream` with `Snappy.uncompress` . Here is the data format compatibility matrix:
2014-12-26 03:17:12 +01:00
| Write\Read | `Snappy.uncompress` | `SnappyInputStream` | `SnappyFramedInputStream` |
| --------------- |:-------------------:|:------------------:|:-----------------------:|
2015-12-02 12:37:02 +01:00
| `Snappy.compress` | ok | ok | x |
2014-12-26 03:17:12 +01:00
| `SnappyOutputStream` | x | ok | x |
| `SnappyFramedOutputStream` | x | x | ok |
2017-01-23 15:04:10 +01:00
### BitShuffle API
To use BitShuffle routines, you need to import `org.xerial.snapy.BitShuffle` in your Java code:
```java
import org.xerial.snappy.BitShuffle;
```
Then use them like this:
```java
int[] data = new int[] {1, 3, 34, 43, 34};
byte[] shuffledByteArray = BitShuffle.bitShuffle(data);
byte[] compressed = Snappy.compress(shuffledByteArray);
byte[] uncompressed = Snappy.uncompress(compressed);
int[] result = BitShuffle.bitUnShuffleIntArray(uncompress);
System.out.println(result);
```
You can also shuffle and unshuffle the other primitive arrays (`short[]`, `long[]` , `float[]` , and `double[]` ) and
the other routines can be found in [Javadoc ](http://static.javadoc.io/org.xerial.snappy/snappy-java/1.1.3-M1/org/xerial/snappy/BitShuffle.html ).
2012-09-06 03:36:03 +02:00
### Setting classpath
If you have snappy-java-(VERSION).jar in the current directory, use `-classpath` option as follows:
2012-09-06 03:45:59 +02:00
$ javac -classpath ".;snappy-java-(VERSION).jar" Sample.java # in Windows
2015-12-02 12:37:02 +01:00
or
2012-09-06 03:45:59 +02:00
$ javac -classpath ".:snappy-java-(VERSION).jar" Sample.java # in Mac or Linux
2012-09-06 03:36:03 +02:00
## Public discussion group
2012-09-06 03:44:09 +02:00
Post bug reports or feature request to the Issue Tracker: < https: / / github . com / xerial / snappy-java / issues >
2012-09-06 03:36:03 +02:00
2016-01-22 11:40:47 +01:00
Public discussion forum is here: [Xerial Public Discussion Group ](http://groups.google.com/group/xerial?hl=en )
2012-09-06 03:36:03 +02:00
2014-06-26 07:39:50 +02:00
## For developers
2014-06-26 07:33:54 +02:00
2014-06-26 07:39:50 +02:00
snappy-java uses sbt (simple build tool for Scala) as a build tool. Here is a simple usage
$ ./sbt # enter sbt console
> ~test # run tests upon source code change
> ~test-only * # run tests that matches a given name pattern
> publishM2 # publish jar to $HOME/.m2/repository
> package # create jar file
2015-05-15 04:19:17 +02:00
> findbugs # Produce findbugs report in target/findbugs
> jacoco:cover # Report the code coverage of tests to target/jacoco folder
2015-05-15 04:28:25 +02:00
If you need to see detailed debug messages, launch sbt with `-Dloglevel=debug` option:
```
$ ./sbt -Dloglevel=debug
```
2014-06-26 07:39:50 +02:00
For the details of sbt usage, see my blog post: [Building Java Projects with sbt ](http://xerial.org/blog/2014/03/24/sbt/ )
2014-06-26 07:33:54 +02:00
2017-01-20 08:29:17 +01:00
### Building from the source code
See the [build instruction ](https://github.com/xerial/snappy-java/blob/master/BUILD.md ). 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), g++ compiler (mingw in Windows) etc.
$ git clone https://github.com/xerial/snappy-java.git
$ cd snappy-java
$ make
When building on Solaris, use `gmake` :
$ gmake
A file `target/snappy-java-$(version).jar` is the product additionally containing the native library built for your platform.
2012-09-06 03:36:03 +02:00
## Miscellaneous Notes
### Using snappy-java with Tomcat 6 (or higher) Web Server
2015-12-02 12:37:02 +01:00
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.
2012-09-06 03:36:03 +02:00
2017-01-20 08:29:17 +01:00
### Configure snappy-java using property file
Prepare org-xerial-snappy.properties file (under the root path of your library) in Java's property file format.
Here is a list of the available properties:
* org.xerial.snappy.lib.path (directory containing a snappyjava's native library)
* org.xerial.snappy.lib.name (library file name)
* org.xerial.snappy.tempdir (temporary directory to extract a native library bundled in snappy-java)
* org.xerial.snappy.use.systemlib (if this value is true, use system installed libsnappyjava.so looking the path specified by java.library.path)
2017-01-20 08:30:55 +01:00
----
Snappy-java is developed by [Taro L. Saito ](http://www.xerial.org/leo ). Twitter [@taroleo ](http://twitter.com/#!/taroleo )