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

 /**
     *使用灾难级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 如果一个文件中的内容,重复的数据不多,压缩效果也不会很明显

原文地址:https://www.cnblogs.com/qyx66/p/12109638.html

时间: 2024-10-20 04:37:02

使用赫夫曼编码压缩解压文件(三)及注意事项的相关文章

通过SharpZipLib来压缩解压文件

在项目开发中,一些比较常用的功能就是压缩解压文件了,其实类似的方法有许多 ,现将通过第三方类库SharpZipLib来压缩解压文件的方法介绍如下,主要目的是方便以后自己阅读,当然可以帮到有需要的朋友更好了,代码比较简单. public class ZipAndUnzipFileBySharpZipLib    {        /// <summary>        /// 解压文件        /// </summary>        /// <param name=

使用 ICSharpCode.SharpZipLib.Zip压缩解压文件

/// <summary> /// 功能:解压zip格式的文件. /// </summary> /// <param name="zipFilePath">压缩文件路径</param> /// <param name="unZipDir">解压文件存放路径,为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹</param> /// <returns>解压是否成功</ret

linux压缩解压文件

首先进入文件夹 cd /home/ftp2/1520/web 压缩方法一:压缩web下的888.com网站 zip -r 888.com.zip888.com 压缩方法二:将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件. zip -r myfile.zip ./* 解压unzip -o -d /home/sunny myfile.zip 把myfile.zip文件解压到 /home/sunny/ -o:不提示的情况下覆盖文件:-d:-d /ho

跨平台的zip文件压缩处理,支持压缩解压文件夹

根据minizip改写的模块,需要zlib支持 输出的接口: 1 #define RG_ZIP_FILE_REPLACE 0 2 #define RG_ZIP_FILE_APPEND 1 3 4 //压缩文件夹目录,递归压缩 5 //szDir是需要压缩的目录,dstLevel是压缩的目录在压缩包里面的层次标识 6 //可直接指定"" 7 //szZipFile压缩包的文件名 8 //replaceFlag指定替换或者是追加进压缩包 9 int DoZipDir(const char*

tar压缩解压文件

查看visualization1.5.tar.gz 压缩包里面的内容: $ tar -tf visualization1.5.tar.gz 解压指定文件JavascriptVisualRelease/BFS.html到/home目录下(CentOS, ubuntu不可以) $ tar -zxvf visualization1.5.tar.gz JavascriptVisualRelease/BFS.html -C /home/ 解压指定文件JavascriptVisualRelease/BFS.

winrar命令行压缩解压文件

公司每次通过单向传输设备摆很多文件,可以通过winrar命令行压缩之后传输. WinRAR a -r -ep1 -df 压缩包保存路径 被压缩的文件(夹)路径 例如: "C:\Program Files\WinRAR\winrar.exe"  a  -r  -ep1  -df  "D:\dest\test.rar" "D:\src\" WinRAR x 压缩包路径 解压缩到目标文件夹的路径\ 例如: "C:\Program Files\

python zlib 压缩 解压 文件夹

import os,os.path import zipfile def zip_dir(dirname,zipfilename): filelist = [] if os.path.isfile(dirname): filelist.append(dirname) else : for root, dirs, files in os.walk(dirname): for name in files: filelist.append(os.path.join(root, name)) zf =

压缩解压文件操作

def unzip_file(fname, dirs): import zipfile fz = zipfile.ZipFile(fname, 'r') # for file in fz.namelist(): # print(file) # fz.extract(file, dirs) fz.extractall(dirs) def ungz_file(fname, dirs): t = tarfile.open(fname, "r:*") names = t.getnames()

Linux基本命令—权限管理、文件搜索、帮助、压缩解压、网络通信

Linux基本命令-权限管理.文件搜索.帮助.压缩解压.网络通信 Linux 权限管理命令 文件搜索命令 帮助命令 压缩解压命令 网络通信指令 2017-11-12 权限管理命令 chmod 改变文件或目录权限: 格式:chmod [{ugo} {+-=} {rwx}] [文件或目录]:或 [mode=421] [文件或目录] -u:所有者: -g:所属组: -o:其他人 -rwx:可读可写可执行:对应权值 r-4.w-2.x-1,可按照数字改变权限:eg.rwxr-xr--表示754: eg.