有关ZLib可参见官方主页 http://www.zlib.net/
ZLib可以简单的理解为压缩/解压缩算法,它与ZIP、RAR等归档算法有所不同,与bzip2比较接近。
压缩工具代码如下:
/** * 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:[email protected]">梁栋</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();}}
测试用例代码如下:
/** * 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:[email protected]">梁栋</a> * @version 1.0 * @since 1.0 */public class ZLibUtilsTest {@Testpublic final void testBytes() {System.err.println("字节压缩/解压缩测试");String inputStr = "[email protected];[email protected];[email protected]";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);}@Testpublic final void testFile() {String filename = "zlib";File file = new File(filename);System.err.println("文件压缩/解压缩测试");String inputStr = "[email protected];[email protected];[email protected]";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);}}
输入结果
字节压缩/解压缩测试输入字符串:[email protected];[email protected];[email protected]输入字节长度:59压缩后字节长度:39解压缩后字节长度:59输出字符串:[email protected];[email protected];[email protected]文件压缩/解压缩测试输入字符串:[email protected];[email protected];[email protected]输入字节长度:59压缩后字节长度:39解压缩后字节长度:59输出字符串:[email protected];[email protected];[email protected]
应该怎么计算呢?原数据长度59字节,压缩后39字节,大约是33%的压缩率!
ZLib压缩对大字节数据压缩,才能反映出压缩效果。
先占个位儿,回头细致整理!
有关ZLib可参见官方主页 http://www.zlib.net/
ZLib可以简单的理解为压缩/解压缩算法,它与ZIP、RAR等归档算法有所不同,与bzip2比较接近。
压缩工具代码如下:
/** * 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:[email protected]">梁栋</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(); } }
测试用例代码如下:
/** * 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:[email protected]">梁栋</a> * @version 1.0 * @since 1.0 */ public class ZLibUtilsTest { @Test public final void testBytes() { System.err.println("字节压缩/解压缩测试"); String inputStr = "[email protected];[email protected];[email protected]"; 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 = "[email protected];[email protected];[email protected]"; 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); } }
输入结果
字节压缩/解压缩测试 输入字符串: [email protected];[email protected];[email protected] 输入字节长度: 59 压缩后字节长度: 39 解压缩后字节长度: 59 输出字符串: [email protected];[email protected];[email protected] 文件压缩/解压缩测试 输入字符串: [email protected];[email protected];[email protected] 输入字节长度: 59 压缩后字节长度: 39 解压缩后字节长度: 59 输出字符串: [email protected];[email protected];[email protected]
应该怎么计算呢?原数据长度59字节,压缩后39字节,大约是33%的压缩率!
ZLib压缩对大字节数据压缩,才能反映出压缩效果。
先占个位儿,回头细致整理!