在Java中提供
Deflater
和
Inflater
工具类来压缩/解压缩数据。 这两个工具类采用
zlib
算法,下面给出一个封装好的工具。
/**
* util for compress/decompress data
*
* @author lichengwu
* @version 1.0
* @created 2013-02-07 10:14 AM
*/
public final class CompressionUtil {
private static final int BUFFER_SIZE = 4 * 1024;
/**
* compress data by {@linkplain Level}
*
* @author lichengwu
* @created 2013-02-07
*
* @param data
* @param level
* see {@link Level}
* @return
* @throws IOException
*/
public static byte[] compress(byte[] data, Level level) throws IOException {
Assert.notNull(data);
Assert.notNull(level);
Deflater deflater = new Deflater();
// set compression level
deflater.setLevel(level.getLevel());
deflater.setInput(data);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length);
deflater.finish();
byte[] buffer = new byte[BUFFER_SIZE];
while (!deflater.finished()) {
int count = deflater.deflate(buffer); // returns the generated
// code... index
outputStream.write(buffer, 0, count);
}
byte[] output = outputStream.toByteArray();
outputStream.close();
return output;
}
/**
* decompress data
*
* @author lichengwu
* @created 2013-02-07
*
* @param data
* @return
* @throws IOException
* @throws DataFormatException
*/
public static byte[] decompress(byte[] data) throws IOException, DataFormatException {
Assert.notNull(data);
Inflater inflater = new Inflater();
inflater.setInput(data);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length);
byte[] buffer = new byte[BUFFER_SIZE];
while (!inflater.finished()) {
int count = inflater.inflate(buffer);
outputStream.write(buffer, 0, count);
}
byte[] output = outputStream.toByteArray();
outputStream.close();
return output;
}
/**
* Compression level
*/
public static enum Level {
/**
* Compression level for no compression.
*/
NO_COMPRESSION(0),
/**
* Compression level for fastest compression.
*/
BEST_SPEED(1),
/**
* Compression level for best compression.
*/
BEST_COMPRESSION(9),
/**
* Default compression level.
*/
DEFAULT_COMPRESSION(-1);
private int level;
Level(
int level) {
this.level = level;
}
public int getLevel() {
return level;
}
}
}
下面是一个测试:
@Test
public void testCompress() throws Exception {
BufferedInputStream in = new BufferedInputStream(new FileInputStream(
"/Users/lichengwu/tmp/out_put.txt.bak"));
ByteArrayOutputStream out = new ByteArrayOutputStream(1024);
byte[] temp = new byte[1024];
int size = 0;
while ((size = in.read(temp)) != -1) {
out.write(temp, 0, size);
}
in.close();
byte[] data = out.toByteArray();
byte[] output = CompressionUtil.compress(data, CompressionUtil.Level.BEST_COMPRESSION);
System.out.println("before : " + (data.length / 1024) + "k");
System.out.println("after : " + (output.length / 1024) + "k");
FileOutputStream fos = new FileOutputStream("/Users/lichengwu/tmp/out_put.txt.bak.compress");
fos.write(output);
out.close();
fos.close();
}
@Test
public void testDecompress() throws Exception {
BufferedInputStream in = new BufferedInputStream(new FileInputStream(
"/Users/lichengwu/tmp/out_put.txt.bak.compress"));
ByteArrayOutputStream out = new ByteArrayOutputStream(1024);
byte[] temp = new byte[1024];
int size = 0;
while ((size = in.read(temp)) != -1) {
out.write(temp, 0, size);
}
in.close();
byte[] data = out.toByteArray();
byte[] output = CompressionUtil.decompress(data);
System.out.println("before : " + (data.length / 1024) + "k");
System.out.println("after : " + (output.length / 1024) + "k");
FileOutputStream fos = new FileOutputStream("/Users/lichengwu/tmp/out_put.txt.bak.decompress");
fos.write(output);
out.close();
fos.close();
}
关于OutOfMemoryError,请参考:http://www.devguli.com/blog/eng/java-deflater-and-outofmemoryerror/