使用赫夫曼编码压缩解压文件及注意事项

Posted qyx66

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用赫夫曼编码压缩解压文件及注意事项相关的知识,希望对你有一定的参考价值。

 /**
     *使用灾难级IO方案进行压缩
     * @param srcFile 希望的压缩的文件全路径
     * @param dstFile 压缩文件的保存路径
     */
    public static void zipFile(String srcFile,String dstFile)
    {
        //创建输出流
        FileOutputStream os=null;
        //创建输出流
        FileInputStream is=null;
        ObjectOutputStream oos=null;
        try {
            //创建文件的输入流
            is=new FileInputStream(srcFile);
            //创建一个和源文件大小一样的byte数组
            //is.available()返回当前文件的大小
            byte[] b=new byte[is.available()];
            //读取文件
            is.read(b);
            //使用赫夫曼编码进行编码:1 获取到文件对应的编码
            //直接对源文件进行压缩
            byte[] bytes=huffmanZip(b);
            //创建文件的输出流,存放压缩文件
            os=new FileOutputStream(dstFile);
            //创建一个和文件输出流关联的ObjectOutputStream
            //把经过赫夫曼编码后的字节数组写入压缩文件
            oos=new ObjectOutputStream(os);
            oos.writeObject(bytes);//这里我们以对象流的方式写入赫夫曼编码,是为了以后我们恢复源文件时使用
            //注意一定要把赫夫曼编码写入压缩文件
            oos.writeObject(huffmanCodes);
        } catch (FileNotFoundException e) {
            System.out.println(e.getMessage());
        } catch (IOException e) {
           System.out.println(e.getMessage());
        } finally {
            if (is!=null)
            {
                try {
                    is.close();
                } catch (IOException e) {
                    System.out.println(e.getMessage());
                }
            }
            if (os!=null)
            {
                try {
                    os.close();
                } catch (IOException e) {
                    System.out.println(e.getMessage());
                }
            }
            if (oos!=null)
            {
                try {
                    oos.close();
                } catch (IOException e) {
                    System.out.println(e.getMessage());
                }
            }
        }
    }
    //编写一个方法,完成对压缩文件的解压

    /**
     *
     * @param zipFile 准备解压的文件
     * @param dstFile 将文件解压到那个路径
     */
    public static  void unZip(String zipFile,String dstFile)
    {
        //创建文件输入流
        InputStream is=null;
        //定义一个对象输入流
        ObjectInputStream ois=null;
        //定义文件的输出流
        OutputStream os=null;
        try{
            //创建文件输入流
            is=new FileInputStream(zipFile);
            //创建一个和is关联的对象输入流
            ois=new ObjectInputStream(is);
            //读取byte数组 huffmanBytes
            byte[] bytes= (byte[]) ois.readObject();
            //读取赫夫曼编码表
            Map<Byte,String> codes=(Map<Byte,String>)ois.readObject();
            //解码
            byte[] bytes1=decode(codes,bytes);
            //将byte数组写入到目标文件
            os=new FileOutputStream(dstFile);
            //写数据到文件中
            os.write(bytes1);
            os.flush();
        }catch (Exception e)
        {
            System.out.println(e.getMessage());
        }finally {
                if (is!=null)
                {
                    try {
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            if (ois!=null)
            {
                try {
                    ois.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (os!=null)
            {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

此代码续上文,关于赫夫曼编码代码请参考前2章

赫夫曼编码压缩文件注意事项

1 如果文件本身就是经过压缩处理的,那么使用赫夫曼编码再压缩效率也不会有明显变化,比如视频文件,.pptx等等文件

2 赫夫曼编码是按字节来处理的,因此可以处理所有的文件(二进制文件,文本文件)

3 如果一个文件中的内容,重复的数据不多,压缩效果也不会很明显

以上是关于使用赫夫曼编码压缩解压文件及注意事项的主要内容,如果未能解决你的问题,请参考以下文章

文件压缩与解压-霍夫曼编码

图像压缩基于matlab余弦变换及霍夫曼编码jpeg压缩和解压含Matlab源码 2086期

图像压缩基于matlab余弦变换及霍夫曼编码jpeg压缩和解压含Matlab源码 2086期

C++程序编写压缩器/解压器(长度-游程编码的压缩/解压+霍夫曼编码压缩/解压 (霍夫曼树))

算法系列之赫夫曼编码实战一数据压缩数据解压

哈夫曼编码压缩与解压思路分析与Java代码实现