您的位置:首页 > 编程语言 > Java开发

Java压缩技术(一) ZLib

2016-06-11 11:55 253 查看
原文:http://snowolf.iteye.com/blog/465433

有关ZLib可参见官方主页 http://www.zlib.net/
ZLib可以简单的理解为压缩/解压缩算法,它与ZIP、RAR等归档算法有所不同,与bzip2比较接近。

压缩工具代码如下:

Java代码


/**

* 2009-9-9

*/

package org.zlex.commons.io;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.util.zip.Deflater;

import java.util.zip.DeflaterOutputStream;

import java.util.zip.Inflater;

import java.util.zip.InflaterInputStream;

/**

* ZLib压缩工具

*

* @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>

* @version 1.0

* @since 1.0

*/

public abstract class ZLibUtils {

/**

* 压缩

*

* @param data

* 待压缩数据

* @return byte[] 压缩后的数据

*/

public static byte[] compress(byte[] data) {

byte[] output = new byte[0];

Deflater compresser = new Deflater();

compresser.reset();

compresser.setInput(data);

compresser.finish();

ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length);

try {

byte[] buf = new byte[1024];

while (!compresser.finished()) {

int i = compresser.deflate(buf);

bos.write(buf, 0, i);

}

output = bos.toByteArray();

} catch (Exception e) {

output = data;

e.printStackTrace();

} finally {

try {

bos.close();

} catch (IOException e) {

e.printStackTrace();

}

}

compresser.end();

return output;

}

/**

* 压缩

*

* @param data

* 待压缩数据

*

* @param os

* 输出流

*/

public static void compress(byte[] data, OutputStream os) {

DeflaterOutputStream dos = new DeflaterOutputStream(os);

try {

dos.write(data, 0, data.length);

dos.finish();

dos.flush();

} catch (IOException e) {

e.printStackTrace();

}

}

/**

* 解压缩

*

* @param data

* 待压缩的数据

* @return byte[] 解压缩后的数据

*/

public static byte[] decompress(byte[] data) {

byte[] output = new byte[0];

Inflater decompresser = new Inflater();

decompresser.reset();

decompresser.setInput(data);

ByteArrayOutputStream o = new ByteArrayOutputStream(data.length);

try {

byte[] buf = new byte[1024];

while (!decompresser.finished()) {

int i = decompresser.inflate(buf);

o.write(buf, 0, i);

}

output = o.toByteArray();

} catch (Exception e) {

output = data;

e.printStackTrace();

} finally {

try {

o.close();

} catch (IOException e) {

e.printStackTrace();

}

}

decompresser.end();

return output;

}

/**

* 解压缩

*

* @param is

* 输入流

* @return byte[] 解压缩后的数据

*/

public static byte[] decompress(InputStream is) {

InflaterInputStream iis = new InflaterInputStream(is);

ByteArrayOutputStream o = new ByteArrayOutputStream(1024);

try {

int i = 1024;

byte[] buf = new byte[i];

while ((i = iis.read(buf, 0, i)) > 0) {

o.write(buf, 0, i);

}

} catch (IOException e) {

e.printStackTrace();

}

return o.toByteArray();

}

}

测试用例代码如下:

Java代码


/**

* 2009-9-9

*/

package org.zlex.commons.io;

import static org.junit.Assert.*;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import org.junit.Test;

/**

* ZLib压缩测试用例

*

* @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>

* @version 1.0

* @since 1.0

*/

public class ZLibUtilsTest {

@Test

public final void testBytes() {

System.err.println("字节压缩/解压缩测试");

String inputStr = "snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org";

System.err.println("输入字符串:\t" + inputStr);

byte[] input = inputStr.getBytes();

System.err.println("输入字节长度:\t" + input.length);

byte[] data = ZLibUtils.compress(input);

System.err.println("压缩后字节长度:\t" + data.length);

byte[] output = ZLibUtils.decompress(data);

System.err.println("解压缩后字节长度:\t" + output.length);

String outputStr = new String(output);

System.err.println("输出字符串:\t" + outputStr);

assertEquals(inputStr, outputStr);

}

@Test

public final void testFile() {

String filename = "zlib";

File file = new File(filename);

System.err.println("文件压缩/解压缩测试");

String inputStr = "snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org";

System.err.println("输入字符串:\t" + inputStr);

byte[] input = inputStr.getBytes();

System.err.println("输入字节长度:\t" + input.length);

try {

FileOutputStream fos = new FileOutputStream(file);

ZLibUtils.compress(input, fos);

fos.close();

System.err.println("压缩后字节长度:\t" + file.length());

} catch (Exception e) {

fail(e.getMessage());

}

byte[] output = null;

try {

FileInputStream fis = new FileInputStream(file);

output = ZLibUtils.decompress(fis);

fis.close();

} catch (Exception e) {

fail(e.getMessage());

}

System.err.println("解压缩后字节长度:\t" + output.length);

String outputStr = new String(output);

System.err.println("输出字符串:\t" + outputStr);

assertEquals(inputStr, outputStr);

}

}

输入结果

Consloe代码


字节压缩/解压缩测试

输入字符串: snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org

输入字节长度: 59

压缩后字节长度: 39

解压缩后字节长度: 59

输出字符串: snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org

文件压缩/解压缩测试

输入字符串: snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org

输入字节长度: 59

压缩后字节长度: 39

解压缩后字节长度: 59

输出字符串: snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org

应该怎么计算呢?原数据长度59字节,压缩后39字节,大约是33%的压缩率!

ZLib压缩对大字节数据压缩,才能反映出压缩效果。


先占个位儿,回头细致整理!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: