
【数算-24】压缩文件【赫夫曼树实际应用】
发布日期:2021-05-07 08:58:03
浏览次数:22
分类:精选文章
本文共 3255 字,大约阅读时间需要 10 分钟。
文章目录
1、问题描述
2、压缩文件
1、代码实现
/** * @param src 文件源路径 * @param dst 文件目标路径 * @Method zipFile * @Author zhihua.Li * @Version 1.0 * @Description 对文件进行赫夫曼压缩 * @Return void * @Exception * @Date 2021/2/27 20:21 */ private void zipFile(String src, String dst) { FileInputStream is = null; FileOutputStream os = null;// 初始化对象输出流 ObjectOutputStream oos = null; try { // 通过文件输入流读入文件数据 is = new FileInputStream(src);// is.available()方法用来统计数据流中可读取的字节总数// 这里用来创建一个和源文件大小相同的字符数组 byte[] b = new byte[is.available()];// 读取文件 is.read(b);// 直接对源文件进行压缩,使用上节中的整合方法,对传入的原始字符数组进行压缩,转换为压缩后的赫夫曼字符数组 byte[] huffmanBytes = HuffmanZip(b);// 新建文件输出流 os = new FileOutputStream(dst); oos = new ObjectOutputStream(os);// 将压缩后的字符数组写出 oos.writeObject(huffmanBytes);// 将赫夫曼编码表写出 oos.writeObject(huffmanCodes); } catch (Exception e) { e.printStackTrace(); } finally { // 关闭流 try { oos.close(); os.close(); is.close(); } catch (Exception e) { e.printStackTrace(); } } }
2、代码测试
@Test public void test2(){ String src = "d://test.jpg"; String srcZip = "d://img.zip"; zipFile(src,srcZip); System.out.println("压缩成功!");
3、解压文件
1、代码实现
/** * @Method fileDecode * @Author zhihua.Li * @Version 1.0 * @Description * @param zipFile 准备解压的文件 * @param dst 解压后的目标位置 * @Return void * @Exception * @Date 2021/2/27 21:23 */ private void fileDecode(String zipFile,String dst){ FileInputStream is = null; ObjectInputStream ois = null; FileOutputStream os = null; try { // 将经过赫夫曼编码压缩后的文件进行读取 is = new FileInputStream(zipFile); // 使用对象流输入进行读取,可以直接读取到输入流中的对象 ois = new ObjectInputStream(is); // 读取到压缩过程中首先存入的压缩后的字符数组 byte[] huffmanBytes = (byte[])ois.readObject(); // 读取压缩过程中存入的赫夫曼编码map MaphuffmanCodes = (Map ) ois.readObject(); // 通过上节中的解压过程,根据赫夫曼编码map对压缩后的字符数组进行解压 byte[] srcBytes = decode(huffmanCodes, huffmanBytes); // 创建文件输出流,输出到目标文件 os = new FileOutputStream(dst); // 将解码后的原字符数组写出到目标文件中 os.write(srcBytes); } catch (Exception e) { e.printStackTrace(); }finally { // 关闭流 try { os.close(); ois.close(); is.close(); }catch (Exception e){ e.printStackTrace(); } } }
2、代码测试
@Test public void test2() { String src = "d://test.jpg"; String srcZip = "d://img.zip"; String dst = "d://destination.jpg"; zipFile(src, srcZip); System.out.println("压缩成功"); fileDecode(srcZip,dst); System.out.println("解压成功"); }
结果为:



4、注意
只有当原文件中重复数据越多或字符重复频率越高时,压缩效率越高
反之,压缩效果可能并不明显甚至超出原文件大小(因为会额外保存赫夫曼编码的Map)发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月10日 10时10分51秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
数据仓库系列之维度建模
2021-05-09
Scala教程之:函数式的Scala
2021-05-09
java中DelayQueue的使用
2021-05-09
java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程
2021-05-09
线程stop和Interrupt
2021-05-09
Android中定时执行任务的3种实现方法
2021-05-09
nodejs中npm常用命令
2021-05-09
基于Vue2.0+Vue-router构建一个简单的单页应用
2021-05-09
基于vue2.0实现仿百度前端分页效果(二)
2021-05-09
JS魔法堂:函数重载 之 获取变量的数据类型
2021-05-09
时间序列神器之争:Prophet VS LSTM
2021-05-09
SpringBoot中关于Mybatis使用的三个问题
2021-05-09
MapReduce实验
2021-05-09
Leaflet 带箭头轨迹以及沿轨迹带方向的动态marker
2021-05-09
java大数据最全课程学习笔记(1)--Hadoop简介和安装及伪分布式
2021-05-09
java大数据最全课程学习笔记(2)--Hadoop完全分布式运行模式
2021-05-09
程序员需要了解依赖冲突的原因以及解决方案
2021-05-09
还在使用集合类完成这些功能?不妨来看看 Guava 集合类!!!
2021-05-09
大部分程序员还不知道的 Servelt3 异步请求,原来这么简单?
2021-05-09