Java压缩技术(一) ZLib

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

压缩工具代码如下: 
Java代码   收藏代码
  1. /** 
  2.  * 2009-9-9 
  3.  */  
  4. package org.zlex.commons.io;  
  5.   
  6. import java.io.ByteArrayOutputStream;  
  7. import java.io.IOException;  
  8. import java.io.InputStream;  
  9. import java.io.OutputStream;  
  10. import java.util.zip.Deflater;  
  11. import java.util.zip.DeflaterOutputStream;  
  12. import java.util.zip.Inflater;  
  13. import java.util.zip.InflaterInputStream;  
  14.   
  15. /** 
  16.  * ZLib压缩工具 
  17.  *  
  18.  * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a> 
  19.  * @version 1.0 
  20.  * @since 1.0 
  21.  */  
  22. public abstract class ZLibUtils {  
  23.   
  24.     /** 
  25.      * 压缩 
  26.      *  
  27.      * @param data 
  28.      *            待压缩数据 
  29.      * @return byte[] 压缩后的数据 
  30.      */  
  31.     public static byte[] compress(byte[] data) {  
  32.         byte[] output = new byte[0];  
  33.   
  34.         Deflater compresser = new Deflater();  
  35.   
  36.         compresser.reset();  
  37.         compresser.setInput(data);  
  38.         compresser.finish();  
  39.         ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length);  
  40.         try {  
  41.             byte[] buf = new byte[1024];  
  42.             while (!compresser.finished()) {  
  43.                 int i = compresser.deflate(buf);  
  44.                 bos.write(buf, 0, i);  
  45.             }  
  46.             output = bos.toByteArray();  
  47.         } catch (Exception e) {  
  48.             output = data;  
  49.             e.printStackTrace();  
  50.         } finally {  
  51.             try {  
  52.                 bos.close();  
  53.             } catch (IOException e) {  
  54.                 e.printStackTrace();  
  55.             }  
  56.         }  
  57.         compresser.end();  
  58.         return output;  
  59.     }  
  60.   
  61.     /** 
  62.      * 压缩 
  63.      *  
  64.      * @param data 
  65.      *            待压缩数据 
  66.      *  
  67.      * @param os 
  68.      *            输出流 
  69.      */  
  70.     public static void compress(byte[] data, OutputStream os) {  
  71.         DeflaterOutputStream dos = new DeflaterOutputStream(os);  
  72.   
  73.         try {  
  74.             dos.write(data, 0, data.length);  
  75.   
  76.             dos.finish();  
  77.   
  78.             dos.flush();  
  79.         } catch (IOException e) {  
  80.             e.printStackTrace();  
  81.         }  
  82.     }  
  83.   
  84.     /** 
  85.      * 解压缩 
  86.      *  
  87.      * @param data 
  88.      *            待压缩的数据 
  89.      * @return byte[] 解压缩后的数据 
  90.      */  
  91.     public static byte[] decompress(byte[] data) {  
  92.         byte[] output = new byte[0];  
  93.   
  94.         Inflater decompresser = new Inflater();  
  95.         decompresser.reset();  
  96.         decompresser.setInput(data);  
  97.   
  98.         ByteArrayOutputStream o = new ByteArrayOutputStream(data.length);  
  99.         try {  
  100.             byte[] buf = new byte[1024];  
  101.             while (!decompresser.finished()) {  
  102.                 int i = decompresser.inflate(buf);  
  103.                 o.write(buf, 0, i);  
  104.             }  
  105.             output = o.toByteArray();  
  106.         } catch (Exception e) {  
  107.             output = data;  
  108.             e.printStackTrace();  
  109.         } finally {  
  110.             try {  
  111.                 o.close();  
  112.             } catch (IOException e) {  
  113.                 e.printStackTrace();  
  114.             }  
  115.         }  
  116.   
  117.         decompresser.end();  
  118.         return output;  
  119.     }  
  120.   
  121.     /** 
  122.      * 解压缩 
  123.      *  
  124.      * @param is 
  125.      *            输入流 
  126.      * @return byte[] 解压缩后的数据 
  127.      */  
  128.     public static byte[] decompress(InputStream is) {  
  129.         InflaterInputStream iis = new InflaterInputStream(is);  
  130.         ByteArrayOutputStream o = new ByteArrayOutputStream(1024);  
  131.         try {  
  132.             int i = 1024;  
  133.             byte[] buf = new byte[i];  
  134.   
  135.             while ((i = iis.read(buf, 0, i)) > 0) {  
  136.                 o.write(buf, 0, i);  
  137.             }  
  138.   
  139.         } catch (IOException e) {  
  140.             e.printStackTrace();  
  141.         }  
  142.         return o.toByteArray();  
  143.     }  
  144. }  

测试用例代码如下: 
Java代码   收藏代码
  1. /** 
  2.  * 2009-9-9 
  3.  */  
  4. package org.zlex.commons.io;  
  5.   
  6. import static org.junit.Assert.*;  
  7.   
  8. import java.io.File;  
  9. import java.io.FileInputStream;  
  10. import java.io.FileOutputStream;  
  11.   
  12. import org.junit.Test;  
  13.   
  14. /** 
  15.  * ZLib压缩测试用例 
  16.  *  
  17.  * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a> 
  18.  * @version 1.0 
  19.  * @since 1.0 
  20.  */  
  21. public class ZLibUtilsTest {  
  22.   
  23.     @Test  
  24.     public final void testBytes() {  
  25.         System.err.println("字节压缩/解压缩测试");  
  26.         String inputStr = "snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org";  
  27.         System.err.println("输入字符串:\t" + inputStr);  
  28.         byte[] input = inputStr.getBytes();  
  29.         System.err.println("输入字节长度:\t" + input.length);  
  30.   
  31.         byte[] data = ZLibUtils.compress(input);  
  32.         System.err.println("压缩后字节长度:\t" + data.length);  
  33.   
  34.         byte[] output = ZLibUtils.decompress(data);  
  35.         System.err.println("解压缩后字节长度:\t" + output.length);  
  36.         String outputStr = new String(output);  
  37.         System.err.println("输出字符串:\t" + outputStr);  
  38.   
  39.         assertEquals(inputStr, outputStr);  
  40.     }  
  41.   
  42.     @Test  
  43.     public final void testFile() {  
  44.         String filename = "zlib";  
  45.         File file = new File(filename);  
  46.         System.err.println("文件压缩/解压缩测试");  
  47.         String inputStr = "snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org";  
  48.         System.err.println("输入字符串:\t" + inputStr);  
  49.         byte[] input = inputStr.getBytes();  
  50.         System.err.println("输入字节长度:\t" + input.length);  
  51.   
  52.         try {  
  53.   
  54.             FileOutputStream fos = new FileOutputStream(file);  
  55.             ZLibUtils.compress(input, fos);  
  56.             fos.close();  
  57.             System.err.println("压缩后字节长度:\t" + file.length());  
  58.         } catch (Exception e) {  
  59.             fail(e.getMessage());  
  60.         }  
  61.   
  62.         byte[] output = null;  
  63.   
  64.         try {  
  65.             FileInputStream fis = new FileInputStream(file);  
  66.             output = ZLibUtils.decompress(fis);  
  67.             fis.close();  
  68.   
  69.         } catch (Exception e) {  
  70.             fail(e.getMessage());  
  71.         }  
  72.         System.err.println("解压缩后字节长度:\t" + output.length);  
  73.         String outputStr = new String(output);  
  74.         System.err.println("输出字符串:\t" + outputStr);  
  75.   
  76.         assertEquals(inputStr, outputStr);  
  77.     }  
  78. }  

输入结果 
Consloe代码   收藏代码
  1. 字节压缩/解压缩测试  
  2. 输入字符串:  snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org  
  3. 输入字节长度: 59  
  4. 压缩后字节长度:    39  
  5. 解压缩后字节长度:   59  
  6. 输出字符串:  snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org  
  7. 文件压缩/解压缩测试  
  8. 输入字符串:  snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org  
  9. 输入字节长度: 59  
  10. 压缩后字节长度:    39  
  11. 解压缩后字节长度:   59  
  12. 输出字符串:  snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org  


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

ZLib压缩对大字节数据压缩,才能反映出压缩效果。  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java是一种高级编程语言,具有广泛的应用领域。二进制是一种计算机数据的表示方式,它由0和1组成,常用于存储和传输数据。压缩是一种通过降低数据的体积来节省存储空间和传输带宽的技术。而zlib是一个在Java中用于数据压缩和解压缩的开源库。 使用Java进行二进制压缩可以借助zlib这个开源库。zlib提供了一系列的API,可以用于将数据压缩zlib格式或解压缩zlib格式的数据。 在使用Java进行二进制压缩之前,需要先导入zlib库并确保其正确配置。然后,可以使用Java提供的输入输出流类(如InputStream和OutputStream)来读取和写入数据。 首先,需要创建一个输入流来读取待压缩的二进制数据。可以使用Java提供的FileInputStream类来读取文件,或者使用ByteArrayInputStream类来读取内存中的数据。 接下来,需要创建一个输出流来写入压缩后的数据。可以使用Java提供的FileOutputStream类来写入到文件,或者使用ByteArrayOutputStream类来写入到内存中。 然后,创建一个zlib压缩实例。可以使用Java提供的Deflater类来进行压缩操作,通过调用其相关方法设置参数,然后使用其方法进行实际的压缩。 将读取到的二进制数据传递给Deflater类的方法,进行压缩操作,并将压缩后的数据写入到输出流中。 压缩完成后,关闭输入流和输出流,并进行必要的资源释放。 在需要解压缩的时候,可以使用Java提供的Inflater类来进行解压缩操作,实现与上述类似的步骤。 总之,使用Java进行二进制压缩可以借助zlib库来实现,通过合理使用相关的类和方法,可以轻松地对二进制数据进行压缩和解压缩,从而节省存储空间和传输带宽。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值