/*
* Copyright 2013 Eediom Inc. All rights reserved.
*/
package org.araqne.logstorage.file;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.zip.DataFormatException;
import java.util.zip.Deflater;
import java.util.zip.Inflater;
/**
* @since 2.2.0
* @author xeraph
*
*/
public class DeflaterCompression implements Compression {
private Deflater deflater;
private Inflater inflater = new Inflater();
public DeflaterCompression() {
this(3);
}
public DeflaterCompression(int level) {
this.deflater = new Deflater(level);
}
@Override
public ByteBuffer compress(byte[] b, int offset, int limit) throws IOException {
Deflater c = deflater;
c.reset();
c.setInput(b, offset, limit);
c.finish();
ByteBuffer compressed = ByteBuffer.allocate(limit);
int compressedSize = c.deflate(compressed.array());
compressed = ByteBuffer.wrap(Arrays.copyOf(compressed.array(), compressedSize));
return compressed;
}
@Override
public void uncompress(byte[] output, byte[] b, int offset, int limit) throws IOException {
inflater.setInput(b, offset, limit);
try {
inflater.inflate(output);
inflater.reset();
} catch (DataFormatException e) {
throw new IOException(e);
}
}
@Override
public void close() {
deflater.end();
inflater.end();
}
}