Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 428|回复: 0

[JavaIO学习]学习Java压缩技术(六) BZIP2

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-28 23:56:18 | 显示全部楼层 |阅读模式
    BZip2与GZip有什么渊源,我这里不深究。我要说的只是,这两种算法,你在linux下都可以找到相应的操作命令。

    GZip
    压缩
    gzip <file> 将得到压缩文件<file>.gz,同时删除文件<file>
    解压缩
    gzip -d <file>.gz 将得到压缩文件<file>,同时删除文件<file>.gz

    BZip2与之相当,几乎没有什么差别~~
    BZip2
    压缩
    bzip2 <file> 将得到压缩文件<file>.bz2,同时删除文件<file>
    解压缩
    bzip2 -d <file>.bz2 将得到压缩文件<file>,同时删除文件<file>.bz2

    除了命令不同外,几乎是一样的!

    再说实现。GZIP是JDK自带的算法实现,但BZip2则不曾享受这个待遇。 不过,强大的Apache坚决不会让这些个在Linux下如鱼得水的算法在java世界中销声匿迹。Apache在Commons Compress中提供了相应的实现。同时,还包括众所周知的tar、cpio、zip等算法实现,其中最为丰富的当属zip实现了!

    我继续依葫芦画瓢~~~
    BZip2CompressorOutputStream类用于压缩
    BZip2CompressorInputStream类用于解压缩

    先说压缩实现,BZip2CompressorOutputStream只有一个方法用于压缩,就是带定长的write方法。简单调用如下文所示:
            /**
             * 数据压缩
             *
             * @param is
             * @param os
             * @throws Exception
             */
            public static void compress(InputStream is, OutputStream os)
                            throws Exception {
                    BZip2CompressorOutputStream gos = new BZip2CompressorOutputStream(os);
                    int count;
                    byte data[] = new byte[BUFFER];
                    while ((count = is.read(data, 0, BUFFER)) != -1) {
                            gos.write(data, 0, count);
                    }
                    gos.finish();
                    gos.flush();
                    gos.close();
            }
    [/code]
    与GZip实现有何差别?除了换掉了GZIPOutputStream没有任何差别。

    解压缩就更不用说了,BZip2CompressorInputStream提供了一个带定长的read方法。简单调用如下文所示:
            /**
             * 数据解压缩
             *
             * @param is
             * @param os
             * @throws Exception
             */
            public static void decompress(InputStream is, OutputStream os)
                            throws Exception {
                    BZip2CompressorInputStream gis = new BZip2CompressorInputStream(is);
                    int count;
                    byte data[] = new byte[BUFFER];
                    while ((count = gis.read(data, 0, BUFFER)) != -1) {
                            os.write(data, 0, count);
                    }
                    gis.close();
            }
    [/code] 嗯,没什么难度!
    IT这行就是这样,只要你肯用心,能触类旁通,就能融会贯通!
    给一个完整实现:
    /**
    * 2010-4-15
    */
    package org.zlex.commons.compress.compress;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
    import org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream;
    /**
    * BZip2工具
    *
    * @author  <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>
    * @since 1.0
    */
    public abstract class BZip2Utils {
            public static final int BUFFER = 1024;
            public static final CharSequence EXT = ".bz2";
            /**
             * 数据压缩
             *
             * @param data
             * @return
             * @throws Exception
             */
            public static byte[] compress(byte[] data) throws Exception {
                    ByteArrayInputStream bais = new ByteArrayInputStream(data);
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    // 压缩
                    compress(bais, baos);
                    byte[] output = baos.toByteArray();
                    baos.flush();
                    baos.close();
                    bais.close();
                    return output;
            }
            /**
             * 文件压缩
             *
             * @param file
             * @throws Exception
             */
            public static void compress(File file) throws Exception {
                    compress(file, true);
            }
            /**
             * 文件压缩
             *
             * @param file
             * @param delete
             *            是否删除原始文件
             * @throws Exception
             */
            public static void compress(File file, boolean delete) throws Exception {
                    FileInputStream fis = new FileInputStream(file);
                    FileOutputStream fos = new FileOutputStream(file.getPath() + EXT);
                    compress(fis, fos);
                    fis.close();
                    fos.flush();
                    fos.close();
                    if (delete) {
                            file.delete();
                    }
            }
            /**
             * 数据压缩
             *
             * @param is
             * @param os
             * @throws Exception
             */
            public static void compress(InputStream is, OutputStream os)
                            throws Exception {
                    BZip2CompressorOutputStream gos = new BZip2CompressorOutputStream(os);
                    int count;
                    byte data[] = new byte[BUFFER];
                    while ((count = is.read(data, 0, BUFFER)) != -1) {
                            gos.write(data, 0, count);
                    }
                    gos.finish();
                    gos.flush();
                    gos.close();
            }
            /**
             * 文件压缩
             *
             * @param path
             * @throws Exception
             */
            public static void compress(String path) throws Exception {
                    compress(path, true);
            }
            /**
             * 文件压缩
             *
             * @param path
             * @param delete
             *            是否删除原始文件
             * @throws Exception
             */
            public static void compress(String path, boolean delete) throws Exception {
                    File file = new File(path);
                    compress(file, delete);
            }
            /**
             * 数据解压缩
             *
             * @param data
             * @return
             * @throws Exception
             */
            public static byte[] decompress(byte[] data) throws Exception {
                    ByteArrayInputStream bais = new ByteArrayInputStream(data);
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    // 解压缩
                    decompress(bais, baos);
                    data = baos.toByteArray();
                    baos.flush();
                    baos.close();
                    bais.close();
                    return data;
            }
            /**
             * 文件解压缩
             *
             * @param file
             * @throws Exception
             */
            public static void decompress(File file) throws Exception {
                    decompress(file, true);
            }
            /**
             * 文件解压缩
             *
             * @param file
             * @param delete
             *            是否删除原始文件
             * @throws Exception
             */
            public static void decompress(File file, boolean delete) throws Exception {
                    FileInputStream fis = new FileInputStream(file);
                    FileOutputStream fos = new FileOutputStream(file.getPath().replace(EXT,
                                    ""));
                    decompress(fis, fos);
                    fis.close();
                    fos.flush();
                    fos.close();
                    if (delete) {
                            file.delete();
                    }
            }
            /**
             * 数据解压缩
             *
             * @param is
             * @param os
             * @throws Exception
             */
            public static void decompress(InputStream is, OutputStream os)
                            throws Exception {
                    BZip2CompressorInputStream gis = new BZip2CompressorInputStream(is);
                    int count;
                    byte data[] = new byte[BUFFER];
                    while ((count = gis.read(data, 0, BUFFER)) != -1) {
                            os.write(data, 0, count);
                    }
                    gis.close();
            }
            /**
             * 文件解压缩
             *
             * @param path
             * @throws Exception
             */
            public static void decompress(String path) throws Exception {
                    decompress(path, true);
            }
            /**
             * 文件解压缩
             *
             * @param path
             * @param delete
             *            是否删除原始文件
             * @throws Exception
             */
            public static void decompress(String path, boolean delete) throws Exception {
                    File file = new File(path);
                    decompress(file, delete);
            }
    }
    [/code]
    对应再来个测试用例,测试用例如下所示:
    /**
    * 2010-4-13
    */
    package org.zlex.commons.compress.compress;
    import static org.junit.Assert.assertEquals;
    import java.io.DataInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import org.junit.Test;
    /**
    * BZip2
    *
    * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>
    * @since 1.0
    */
    public class BZip2UtilsTest {
    [/code]

    1.         private String inputStr = "zlex@zlex.org,snowolf@zlex.org,zlex.snowolf@zlex.org,zlex@zlex.org,
    2. snowolf@zlex.org,zlex.snowolf@zlex.org,zlex@zlex.org,snowolf@zlex.org,zlex.snowolf@zlex.org,
    3. zlex@zlex.org,snowolf@zlex.org,zlex.snowolf@zlex.org,zlex@zlex.org,snowolf@zlex.org,
    4. zlex.snowolf@zlex.org,zlex@zlex.org,snowolf@zlex.org,zlex.snowolf@zlex.org,zlex@zlex.org,
    5. snowolf@zlex.org,zlex.snowolf@zlex.org,zlex@zlex.org,snowolf@zlex.org,zlex.snowolf@zlex.
    6. org,zlex@zlex.org,snowolf@zlex.org,zlex.snowolf@zlex.org,zlex@zlex.org,
    7. snowolf@zlex.org,zlex.snowolf@zlex.org";
    复制代码
    @Test public final void testDataCompress() throws Exception { byte[] input = inputStr.getBytes(); System.err.println("原文:        " + inputStr); System.err.println("长度:        " + input.length); byte[] data = BZip2Utils.compress(input); System.err.println("压缩后:        "); System.err.println("长度:        " + data.length); byte[] output = BZip2Utils.decompress(data); String outputStr = new String(output); System.err.println("解压缩后:        " + outputStr); System.err.println("长度:        " + output.length); assertEquals(inputStr, outputStr); } @Test public final void testFileCompress() throws Exception { FileOutputStream fos = new FileOutputStream("d:/f.txt"); fos.write(inputStr.getBytes()); fos.flush(); fos.close(); BZip2Utils.compress("d:/f.txt"); BZip2Utils.decompress("d:/f.txt.bz2"); File file = new File("d:/f.txt"); FileInputStream fis = new FileInputStream(file); DataInputStream dis = new DataInputStream(fis); byte[] data = new byte[(int) file.length()]; dis.readFully(data); fis.close(); String outputStr = new String(data); assertEquals(inputStr, outputStr); } }  
    虽然,两种算法在代码实现上几乎没有什么差别,但在压缩上想要看到效果,还真让我费了点事!
    控制台输出(略)

       
       
    GZIP本身不需要太长的内容,经过压缩就能体现出压缩效果,而BZip2则需要压缩很长的内容时,才能体现其压缩效果,这说明BZip2更适合大数据压缩?!
       

       
       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/10/28/235618296.rar
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-26 03:57 , Processed in 0.310936 second(s), 38 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表