com.addthis.hydra.store.compress.CompressedStream.java Source code

Java tutorial

Introduction

Here is the source code for com.addthis.hydra.store.compress.CompressedStream.java

Source

/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.addthis.hydra.store.compress;

import javax.annotation.Nonnull;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import java.util.zip.GZIPOutputStream;

import com.addthis.basis.io.GZIPInputStreamX;

import com.ning.compress.lzf.LZFInputStream;
import com.ning.compress.lzf.LZFOutputStream;

import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
import org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream;

import org.tukaani.xz.LZMA2Options;
import org.tukaani.xz.LZMAInputStream;
import org.tukaani.xz.XZInputStream;
import org.tukaani.xz.XZOutputStream;
import org.xerial.snappy.SnappyInputStream;
import org.xerial.snappy.SnappyOutputStream;

public class CompressedStream {

    private static final int BUFFER_SIZE = 4096;

    public static @Nonnull InputStream decompressInputStream(@Nonnull InputStream in, @Nonnull String name)
            throws IOException {
        if (name.endsWith(CompressionType.GZIP.suffix)) {
            in = new GZIPInputStreamX(in, BUFFER_SIZE);
        } else if (name.endsWith(CompressionType.LZF.suffix)) {
            in = new LZFInputStream(in);
        } else if (name.endsWith(CompressionType.SNAPPY.suffix)) {
            in = new SnappyInputStream(in);
        } else if (name.endsWith(CompressionType.BZIP2.suffix)) {
            in = new BZip2CompressorInputStream(in, true);
        } else if (name.endsWith(CompressionType.LZMA.suffix)) {
            in = new LZMAInputStream(in);
        } else if (name.endsWith(CompressionType.XZ.suffix)) {
            in = new XZInputStream(in);
        }
        return in;
    }

    public static @Nonnull OutputStream compressOutputStream(@Nonnull OutputStream out,
            @Nonnull CompressionType type) throws IOException {
        switch (type) {
        case GZIP:
            out = new GZIPOutputStream(out, BUFFER_SIZE);
            break;
        case LZF:
            out = new LZFOutputStream(out);
            break;
        case SNAPPY:
            out = new SnappyOutputStream(out);
            break;
        case BZIP2:
            out = new BZip2CompressorOutputStream(out);
            break;
        case LZMA:
            throw new UnsupportedOperationException(
                    "Writing .lzma files is no longer supported. Use .xz format instead");
        case XZ:
            out = new XZOutputStream(out, new LZMA2Options());
            break;
        default:
            throw new IllegalStateException("Unknown compression type " + type);
        }
        return out;
    }

}