尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
文本压缩的实现
前言我们利用前面写的哈夫曼树哈夫曼编码实现一个文本压缩工具我们将文本转化为0,1二进制编码这些编码数字都是比特单位一个字节转化为八个比特从而实现文本的压缩但是得注意最后的几个编码不满8位得用0补齐。整体流程读取文件-统计字符频次→构建哈夫曼树→生成字符编码→原文转二进制码流→二进制串转字节写入压缩文件。1.利用main函数去点用各个函数在上次的文本读取之上有所改善publicstaticvoidmain(String[]args){CompresshfmnewCompress();hfm.readData();hfm.setCode(hfm.root,);hfm.dataToCode();}2.在readData中添加一个data保存原始数据datastringBuilder.toString();避免原始数据编码统计被污染3.dataToCode () bitToByte ()可以实现01编码的拼接以及比特编码转化为字节实现压缩//把源文件数据替换成编码数据publicvoiddataToCode(){StringBuilderstringBuildernewStringBuilder();for(inti0;idata.length();i){charcdata.charAt(i);//取出对应字符的编码StringcodecodeMap.get(c);stringBuilder.append(code);}System.out.println(data:stringBuilder.toString());try{bitToByte(stringBuilder);}catch(Exceptione){thrownewRuntimeException(e);}}//把编码数据(二进制数据)每8个一组转成byte写入文件//除了保存编码数据还需要保存字典(每个字符对应的编码)publicvoidbitToByte(StringBuilderstringBuilder)throwsException{//创建文件字符流把压缩后的字节数据写入文件FilefilenewFile(D:\\IdeaProjects\\java02\\src\\hfm0718\\data.txt);//文件字节流FileOutputStreamfosnewFileOutputStream(file);intlenstringBuilder.length();//计算最后一个字节是否需要补位intlast(8-len%8)%8;//补齐最后的数据for(inti0;ilast;i){stringBuilder.append(0);}//计算有多少字节数据intbyteLenstringBuilder.length()/8;//从stringBuilder分割出所有的字节数据for(inti0;ibyteLen;i){StringstrstringBuilder.substring(i*8,(i1)*8);//左开(包含) 右闭(不包含)//把二进制数据转成byteintdataInteger.parseInt(str,2);//把当前数据写入文件fos.write(data);fos.flush();}//把最后补位的长度写入文件fos.write(last);fos.flush();}//计算最后一个字节是否需要补位intlast(8-len%8)%8;//补齐最后的数据for(inti0;ilast;i){stringBuilder.append(0);}这个值得记忆性学习可以最外面这个取余8直接处理刚好整除的边界情况即不用补位的时候否则需要写if去分类讨论。//创建文件字节流把压缩后的字节数据写入文件FilefilenewFile(D:\\IdeaProjects\\java02\\src\\hfm0718\\data.txt);//文件字节流FileOutputStreamfosnewFileOutputStream(file);创建的字节流用于接受压缩后的文件数据。以下为压缩前后的对比实现了一定的压缩。但是效率并不算高还需要改进。以下为完整代码publicclassCompress{publicTreeNoderoot;publicStringdata;//读取到源文件数据publicMapString,StringcodeMapnewHashMap();//码表//统计字符的频率publicvoidreadData(){//读取指定文件的数据StringpathC:\\Users\\52073\\Downloads\\数据结构模拟题一 (1).doc;FilefilenewFile(path);try{//每次读取文件的一行字符BufferedReaderbrnewBufferedReader(newFileReader(file));StringBuilderstringBuildernewStringBuilder();Stringline;while((linebr.readLine())!null){stringBuilder.append(line).append(\r\n);}datastringBuilder.toString();// System.out.println(data: data);}catch(Exceptione){thrownewRuntimeException(e);}//读取数据MapString,IntegermapnewHashMap();//遍历data的每个字符for(inti0;idata.length();i){charcdata.charAt(i);//检查是否存在当前keyif(map.containsKey(c)){map.put(c,map.get(c)1);}else{map.put(c,1);}}//保存所有的节点对象ListTreeNodenodeListnewArrayList();//遍历map,创建对应的节点for(Map.EntryString,Integerentry:map.entrySet()){TreeNodenodenewTreeNode(entry.getValue(),entry.getKey());nodeList.add(node);}//建树createTree(nodeList);}//对象nodeList排序(升序):插入排序冒泡排序快排publicvoidsort(ListTreeNodenodeList){for(inti0;inodeList.size();i){for(intj0;jnodeList.size()-1;j){if(nodeList.get(j).datanodeList.get(j1).data){TreeNodetempnodeList.get(j);nodeList.set(j,nodeList.get(j1));nodeList.set(j1,temp);}}}}publicvoidcreateTree(ListTreeNodenodeList){while(nodeList.size()1){//先对nodeList排序sort(nodeList);//找出最小的两个节点TreeNodeleftnodeList.remove(0);TreeNoderightnodeList.remove(0);//构建子树TreeNodenodenewTreeNode(left.dataright.data);node.leftleft;node.rightright;//把新节点添加到集合中nodeList.add(node);}rootnodeList.remove(0);}//设置编码:左0 右1publicvoidsetCode(TreeNodenode,Stringcode){if(nodenull)return;//记录叶子节点上的编码if(node.rightnullnode.leftnull){node.codecode;codeMap.put(node.c,node.code);// System.out.println(node.c node.code);}setCode(node.left,code0);setCode(node.right,code1);}//把源文件数据替换成编码数据publicvoiddataToCode(){StringBuilderstringBuildernewStringBuilder();for(inti0;idata.length();i){charcdata.charAt(i);//取出对应字符的编码StringcodecodeMap.get(c);stringBuilder.append(code);}System.out.println(data:stringBuilder.toString());try{bitToByte(stringBuilder);}catch(Exceptione){thrownewRuntimeException(e);}}//把编码数据(二进制数据)每8个一组转成byte写入文件//除了保存编码数据还需要保存字典(每个字符对应的编码)publicvoidbitToByte(StringBuilderstringBuilder)throwsException{//创建文件字符流把压缩后的字节数据写入文件FilefilenewFile(D:\\IdeaProjects\\java02\\src\\hfm0718\\data.txt);//文件字节流FileOutputStreamfosnewFileOutputStream(file);//对象流写入一个整个java 对象到文件中//对象化序化把对象转换成流式数据// ObjectOutputStream oos new ObjectOutputStream(fos);// oos.writeObject(codeMap);// oos.flush();intlenstringBuilder.length();//计算最后一个字节是否需要补位intlast(8-len%8)%8;//补齐最后的数据for(inti0;ilast;i){stringBuilder.append(0);}//计算有多少字节数据intbyteLenstringBuilder.length()/8;//从stringBuilder分割出所有的字节数据for(inti0;ibyteLen;i){StringstrstringBuilder.substring(i*8,(i1)*8);//左开(包含) 右闭(不包含)//把二进制数据转成byteintdataInteger.parseInt(str,2);//把当前数据写入文件fos.write(data);fos.flush();}//把最后补位的长度写入文件fos.write(last);fos.flush();}publicstaticvoidmain(String[]args){CompresshfmnewCompress();hfm.readData();hfm.setCode(hfm.root,);hfm.dataToCode();}}//树的节点classTreeNodeimplementsSerializable{publicintdata;//字符的次publicStringcode;//编码publicStringc;//对应的字符publicTreeNodeleft;publicTreeNoderight;publicTreeNode(){}publicTreeNode(intdata){this.datadata;}publicTreeNode(intdata,Stringc){this.datadata;this.cc;}}
RELATED

相关推荐

XR渲染技术核心解析与性能优化实践

XR渲染技术核心解析与性能优化实践

1. XR渲染技术核心概念解析XR(Extended Reality)作为融合VR、AR、MR的技术综合体,其渲染管线与传统图形渲染存在本质差异。我在实际项目中发现,XR渲染需要同时处理三大核心矛盾:高帧率要求(通常90-120Hz&am…

📅 2026/9/8 11:55:48
Unity网络编程实战:从零实现TCP Socket客户端与粘包拆包解决方案

Unity网络编程实战:从零实现TCP Socket客户端与粘包拆包解决方案

1. 项目概述:为什么Unity项目需要自己处理Socket通讯?在Unity里做网络功能,很多人的第一反应是直接用Unity自带的UNet(现在叫Netcode)或者找一些Asset Store上的插件,比如Photon、Mirror。这当然没问题&…

📅 2026/8/23 17:36:27
嵌入式-RTC实时时钟-知识卡片

嵌入式-RTC实时时钟-知识卡片

RTC 实时时钟 —— STM32 知识卡片⏰ 一句话:RTC 是一个独立于 CPU 的定时器,通过 32 位秒计数器实现 Unix 时间戳计时。系统复位不清零,VDD 断电后由 VBAT 备用电池继续走时。可配置闹钟触发中断或唤醒待机模式。核心要点 后备区域&#xff…

📅 2026/8/23 17:36:27
MORE NEWS

更多资讯

📰

Unity消消乐开发:菜单界面与游戏界面场景解耦实战

简介:这是一份基于Unity 2020.2.23开发的方块消消乐完整项目,面向Unity初学者以及需要完成虚拟现实课程期末作业的学生,资源同时包含菜单界面与游戏界面,实现了基本消除、界面动画、手势识别、消除判定、连续消除判定、分数统计与…

📰

yolov5垃圾分类识别检测:数据、训练到部署全流程实战

简介:这份课程设计资源以YOLOv5为基础,实现垃圾分类识别检测,面向需要完成高质量课程设计或期末大作业的高校学生,也适合入门目标检测的开发者参考。项目已获导师指导并通过,属于97分的高分作品,附带的源码…

📰

玩Steam游戏用什么开黑语音软件?2026兼容全平台的语音工具盘点

Steam 玩家的语音需求,和手游党不太一样。今天玩 CS2 要 5 人语音,明天开坑永劫无间要 3 人小队,后天又回 Apex 拉个四人车——游戏换来换去,语音软件最好一个就够。再加上 Steam 好友分布散,有人用 YY、有人用 QQ 语音…

📰

硕士论文高效写作四步法:从选题到终稿全流程解析

1. 论文写作痛点与破局思路第一次面对3000字硕士论文写作时,我和大多数同学一样陷入焦虑:选题方向模糊、文献梳理耗时、写作效率低下、格式反复修改。直到研二时导师分享的"四步法"彻底改变了我的学术写作方式——这个方法帮助我在两周内完成了…

📰

Python机器学习股市情感分析全流程:从词向量到量化因子

简介:面向金融数据分析与机器学习学习者,该资源提供了一套完整的股市情感分析实践方案。项目以股评文本和上证指数为数据源,通过Python完成情感分析、情绪指标构建,并借助机器学习模型揭示看涨情绪与股市走势之间的关系&#xff0…

📰

CopilotKit + A2A + A2UI 实战:用 AG-UI 协议构建可动态渲染 UI 的餐厅预订 Agent

CopilotKit A2A A2UI 实战:用 AG-UI 协议构建可动态渲染 UI 的餐厅预订 Agent 【免费下载链接】CopilotKit The Frontend Stack for Agents & Generative UI. React, Angular, Mobile, Slack, and more. Makers of the AG-UI Protocol 项目地址: https://gi…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬