文件压缩

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

1.需求分析

利用小堆,huffman编码,文件流操作,二进制文件的读写实现对普通文件的压缩和解压过程。



2.能力要求

A.熟悉对文件的读写操作。

B.熟悉小堆的原理。

C.熟悉HuffmanTree的实现原理、

D.会编码的获取。

E.对编码信息处理和存储。

F.最重要一点,要理解压缩和解压缩的过程。


3.模块介绍。

A设计的存储结构。.

B.压缩过程.

C.解压缩过程。

D.编码的获取。.

E.HuffmanTree的实现。

F.小堆的实现。

G.读文件的操作。


4.压缩和解压缩的原理。

压缩过程:利用数据结构,对文件里面的字符进行统计。以字符出现的频率构建小堆,再利用小堆,构建HuffmanTree。以HuffmanTree左右孩子遍历,左为0,右为1.将统计出来的结果存放到自己设计的结构中。在通过对字符编码进行位进制压缩,可以实现压缩过程。

 

解压缩过程:利用字符和统计次数写配置文件,解压缩就可以通过配置文件建立一颗HuffmanTree,在根据压缩文件内容遍历HuffmanTree,叶子节点即为原来的一个字符。


5.模块具体分析。

A设计的存储结构。


typedef long longtype;
struct FileInfo
{
unsigned char _ch;           //字符
longtype _count;                 //计数器
string _code;               //Huffman编码

}


B.压缩过程.

1.先把文件内容读进来,并进行字符统计。

2.统计字符出现字数,存入_count。

3.依据每个节点的_count值,构建相应的huffman树。

4.将编码压缩,存入文件。

5.把字符和出现次数按照(字符,次数)的形式,每行的保存到配置文件里。


C.解压缩过程。


1.读取配置文件里的内容,构建HuffmanTree。

2.根据压缩文件,和重建的huffman树解压.

3.根据压缩文件字符编码解压文件.


D.编码的获取


void huffmancode(HuffManNode<FileInfo>* root, string& code)


E.HuffmanTree的实现。

struct HuffManNode
{
HuffManNode<T> *_parent;
HuffManNode<T> *_right;
HuffManNode<T> *_left;


T _weight;

}


class HuffManTree
{
public:
typedef HuffManNode<T> Node;

//仿函数
template<class T>
struct Compare
{
bool operator()(Node*& L, Node*& R)
{
return L->_weight < R->_weight;
}
};


private:
Node* _root;



F.小堆的实现。


Heap(const T* array, size_t size)
{
_array.reserve(size);
for (size_t i = 0; i < size; ++i)
{
_array.push_back(array[i]);
}


for (int begin = _array.size() / 2 - 1;
begin >= 0; begin--)
{
_AdjustDown(begin);
}
}

G.读文件的操作。


bool readline(FILE* str, string& code)

1.需求分析

利用小堆,huffman编码,文件流操作,二进制文件的读写实现对普通文件的压缩和解压过程。



2.能力要求

A.熟悉对文件的读写操作。

B.熟悉小堆的原理。

C.熟悉HuffmanTree的实现原理、

D.会编码的获取。

E.对编码信息处理和存储。

F.最重要一点,要理解压缩和解压缩的过程。


3.模块介绍。

A设计的存储结构。.

B.压缩过程.

C.解压缩过程。

D.编码的获取。.

E.HuffmanTree的实现。

F.小堆的实现。

G.读文件的操作。


4.压缩和解压缩的原理。

压缩过程:利用数据结构,对文件里面的字符进行统计。以字符出现的频率构建小堆,再利用小堆,构建HuffmanTree。以HuffmanTree左右孩子遍历,左为0,右为1.将统计出来的结果存放到自己设计的结构中。在通过对字符编码进行位进制压缩,可以实现压缩过程。

 

解压缩过程:利用字符和统计次数写配置文件,解压缩就可以通过配置文件建立一颗HuffmanTree,在根据压缩文件内容遍历HuffmanTree,叶子节点即为原来的一个字符。


5.模块具体分析。

A设计的存储结构。


typedef long longtype;
struct FileInfo
{
unsigned char _ch;           //字符
longtype _count;                 //计数器
string _code;               //Huffman编码

}


B.压缩过程.

1.先把文件内容读进来,并进行字符统计。

2.统计字符出现字数,存入_count。

3.依据每个节点的_count值,构建相应的huffman树。

4.将编码压缩,存入文件。

5.把字符和出现次数按照(字符,次数)的形式,每行的保存到配置文件里。


C.解压缩过程。


1.读取配置文件里的内容,构建HuffmanTree。

2.根据压缩文件,和重建的huffman树解压.

3.根据压缩文件字符编码解压文件.


D.编码的获取


void huffmancode(HuffManNode<FileInfo>* root, string& code)


E.HuffmanTree的实现。

struct HuffManNode
{
HuffManNode<T> *_parent;
HuffManNode<T> *_right;
HuffManNode<T> *_left;


T _weight;

}


class HuffManTree
{
public:
typedef HuffManNode<T> Node;

//仿函数
template<class T>
struct Compare
{
bool operator()(Node*& L, Node*& R)
{
return L->_weight < R->_weight;
}
};


private:
Node* _root;



F.小堆的实现。


Heap(const T* array, size_t size)
{
_array.reserve(size);
for (size_t i = 0; i < size; ++i)
{
_array.push_back(array[i]);
}


for (int begin = _array.size() / 2 - 1;
begin >= 0; begin--)
{
_AdjustDown(begin);
}
}

G.读文件的操作。


bool readline(FILE* str, string& code)

</pre></p><p><span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;"><strong></strong></span></p><p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;"></span></p><pre name="code" class="cpp">

C#实现将文件文件压缩压缩 Title:“基础工具” 项目(压缩包帮助类)Description步骤描述:1、创建 zip 存档,该文档包含指定目录的文件和子目录(单个目录)2、创建 zip 存档,该存档包含指定目录的文件和目录(多个目录)3、递归删除磁盘上的指定文件夹目录及文件4、递归获取磁盘上的指定目录下所有文件的集合,返回类型是:字典[文件名,要压缩的相对文件名]5、解压Zip文件,并覆盖保存到指定的目标路径文件夹下6、获取Zip压缩包中的文件列表。 阅读详情

相关推荐

文件压缩】用Java实现文件压缩和解压

用Java实现一个简单的GUI和文件压缩解压操作。最终效果如下。实际上这个程序主要分为两个部分,分别是图形界面的部分和文件处理的部分。图形界面:用JTextField类实现文本的输入,通过继承ActionListener接口实现反馈操作swing和awt是java中处理图形界面的类。Java的图形界面分为容器container和组件JComponent,容器上可以添加组建。JPanel一般作为容器...

weixin_40841416的博客 1781

压缩文件——文件压缩后还是太大的处理方法

文件压缩后还是太大,可能文件本身已经是压缩格式,如MP4、MP3、PNG等格式,再将其压缩成zip格式文件大小不会改变,其次压缩程度设置的不够,也会导致文件压缩后还是很大,这时候我们可以通过压缩文件本身大小、更换压缩等级或压缩配置等方式解决问题,下面一起来看下具体的方法。我们可以先用【嗨格式压缩大师】软件压缩文件本身的大小,再将其压缩成zip格式。1、打开电脑上安装好的嗨格式压缩大师,选择对应的文件类型,如是PDF文件压缩需要压缩,就点击【PDF压缩】功能。

zhanglongfei1016的专栏 2万+

java压缩文件压缩文件夹下所有文件压缩指定文件下的文件

经过自己的探索,对业务场景的各种业务都做了实现,大功告成码代码如下,方便以后查阅: 1 某文件夹下所有文件压缩(不能含文件夹) /**       * 将存放在sourceFilePath目录下的源文件,打包成fileName名称的zip文件,并存放到zipFilePath路径下       * @param sourceFilePath :待压缩文件路径       * @param zi...

人生最遗憾的莫过于:轻易地放弃了不该放弃的,固执地坚持了不该坚持的 3922

什么是压缩文件/压缩包?

为什么要压缩文件呢? 首先我们需要知道什么是压缩文件 什么是压缩? 计算机是以二进制的形式来储存所有的文件的,也就是00000001111111类似这种形式,压缩文件就会以一种类似编码的形式来储存这些文档,比如四个0连在一起,压缩文件就会以4x0的形式储存在计算机里,当然实际的压缩比这复杂的多,这里只是举一个例子。 也就是说———在计算机内,把00000000变成8x0,这个过程就叫做压缩,所以可以缩小文件的体积,减少所占空间。 好了,现在我们知道什么是压缩了,那我们为什么要压缩呢? ...

yijisama的博客 2万+

在Java中通过压缩流与解压缩流实现文件以及文件夹的压缩与解压缩

在计算机编程中,文件压缩和解压缩是一项常见的任务。它不仅可以节省存储空间,还可以提高文件传输的效率。Java作为一种广泛使用的编程语言,提供了丰富的API来处理这种任务。在这篇文章中,我们将探讨如何在Java中使用压缩流和解压缩流来实现文件文件夹的压缩与解压缩。1、创建一个解压缩流用来读取压缩包中的数据,获取到压缩包里面的每一个zipentry对象,如果获取到文件或者文件夹,解压缩流获取的结果就不是null,否则为null。//创建一个解压缩流用来读取压缩包中的数据。

weixin_73644434的博客 2117

文件压缩的原理

哈喽大家好,我是狗蛋,今天我们继续来分享计算机的冷知识压缩文件到底是什么原理?为啥有些文件可以压缩的很小? 我经常会解压和压缩一些文件 但是在解压或者压缩的时候我们有时候会遇到有些文件,在还没有压缩时是1个G大小压缩之后就却只有几十兆大小,而有些文件压缩之后大小几乎没有变化。 接下来我们来一起了解压缩文件到底是什么原理?为啥有些文件可以压缩的很小? 在了解压缩原理之前我们先来,了解数据的大小,我们前面的文章和大家探索过了,电脑上的数据本身就是有0和1组成的,1个0或者1个1的...

weixin_45586410的博客 5363

php如何压缩文件,php如何实现对文件压缩

压缩一个文件我们将一个文件生成一个压缩包。

weixin_36049771的博客 1684

java压缩linux上的文件,java linux下文件压缩

java linux下文件压缩[2021-02-09 18:02:01]简介:系统运维gizp:*gzip工具不能压缩目录,只能压缩文件压缩:gzip filename[root@localhost test01]# ll -h * #查看压缩前all.txt文件大小-服务器Windows 系统上使用 “.zip”格式压缩文件,其实“.zip”格式文件是 Windows 和 Linux 系...

weixin_31902781的博客 1089

SharpZipLib进行文件压缩和解压缩

一。压缩文件,生成文件流 using System; using System.Collections.Generic; using System.Text; using System.IO; using ICSharpCode.SharpZipLib.Zip; using ICSharpCode.SharpZipLib.Core; namespace TimeInterva...

weixin_30666401的博客 343

如何压缩PDF文件的大小

PDF文件是我们办公中经常会用到的文件格式,这个格式的文件有着较强的兼容性以及较高的安全性,在传输的时候还是很方便快捷的,但是PDF文件也有过大的时候,过大的文件传输起来可没有那么简单了,我们可以借助压缩软件,将PDF文件压缩变小,下面来看看具体的压缩方法。 下面是具体的压缩方法 1:打开压缩软件,我们需要压缩的是PDF文件,就可以点击选择PDF压缩。 2:进入操作界面后点击添加文件的按钮,即...

weixin_44569520的博客 1987

文件压缩压缩文件查找

文件压缩压缩文件查找

这里什么都没有qwq 749

Java 将多个文件压缩成一个压缩文件

①使用 Java 将多个文件打包压缩成一个压缩文件; ②主要使用 java.io 下的类 package com.sinosoft.zt.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStre

weixin_44557238的博客 1518

java mp3文件压缩_java实现文件压缩

java实现文件压缩:主要是流与流之间的传递代码如下:package com.cst.klocwork.service.zip;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.util.ArrayList...

weixin_39616674的博客 883

文件压缩与解压缩

在Java中,文件压缩与解压缩,主要依赖三个类来完成,ZipInputStream、ZipOutputStream、ZipEntry。 使用java来压缩文件,准备好被压缩文件。 Java实现压缩文件,直接上代码 import java.io.*; import java.util.ArrayList; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import ja

WEN38306482的博客 48万+

Huffman文件压缩文件压缩

思路  应用huffman是带权路径最小二叉树这个性质,完成的文件压缩。我们可以应用这个性质。让一个文件中,每个字符出现的次数作为权值。这样离根节点越近的节点,它的字符出现的次数就越多。然后根据这个节点在父节点左,有效编码为0,在右,有效编码为1,从跟遍历到该节点,得到相应的huffman编码,然后用huffman编码去替代该文件中该字符得而实现压缩。   其实上面说的是字符,我们不应该单单把它

我喜欢雨天的清新的博客 733

实现将文件压缩,下载文件压缩

** 如何实现将文件压缩后给用户下载的思路 ** File file = new File(“D:\zhou\excel.xxx”);这里填写要要压缩文件,例如:D:\zhou\excel.xxx File zipFile = new File(“D:\zhou\pack.zip”);这里填写要输出压缩包的地址,例如:D:\zhou\pack.zip //调用压缩方法 //把路径传进去 toZip(file,new FileOutputStream(zipFile)); public void toZip

Zhou_run的博客 352

Android中文件压缩和解压缩

使用场景当我们在应用的Assets目录中需要加入文件时,可以直接将源文件放入,但这样会造成打包后的apk整体过大,此时就需要将放入的文件进行压缩.又如当我们需要从服务器中下载文件时,如果下载源文件耗时又消耗流量,较大文件需要压缩,可以使得传输效率大大提高.下面我们就学习下基本的文件压缩和解压缩.Java中提供了压缩和解压缩的输入输出流

JackChan 1万+
上一篇: 深入理解C++中public、protected及private用法
下一篇: 10-13笔试总结
Armypopy
博客等级 码龄10年 1粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值