文件压缩与解压缩

TrueLove

发布日期: 2019-01-24 08:20:57 浏览量: 954
评分:
star star star star star star star star star_border star_border
*转载请注明来自write-bug.com

摘 要

随着人们对数据的大量需求以及计算机使用时间的增加,计算机磁盘上的文件越来越大,越来越多。如何让有限的磁盘空间容纳更多的数据成为需要解决的问题。一方面,高速发展的存储技术以提高磁盘容量来解决这样的需求,但随着网络环境下数据传递的产生以及带宽的限制,大容量数据问题日益突出。在这两种需求的推动下,对数据压缩的需求产生了。人们可以将文件在不改变其本身的条件下,将其以更小的占用空间存储,并且在需要的时候将文件恢复成原有的样子,这就是压缩目的。本论文主要研究文件的无损压缩技术,并简要介绍了文件压缩的分类、几种常用的无损压缩格式和常用的压缩算法。运用LZ77字典算法、懒惰匹配算法和Huffman编码算法,使用Java语言设计了使用GZIP算法对文件压缩与解压缩的实现程序。用户可以根据自己的需求,使用此程序方便地对文件进行压缩或者解压缩操作。

关键词:压缩;解压缩;GZIP;Java

1 总体设计

系统总体结构设计是系统设计过程中及其重要的一步,对系统的技术层次,开发过程,功能实现及开发成本方面具有重大的影响。系统总统结构设计应尽可能的考虑人机关系,环境条件以及算法的可行性等的联系,使系统每个部分都能协调适应。

本实验论证是基于GZIP算法理论体系的,因此使用的压缩方法是参照GZIP算法的。GZIP算法理论体系主要包含三个内容:LZ77算法,Huffman算法,懒惰匹配算法。因此在设计过程中要注意如何实现这三个算法并且将其结合起来。

1.1 程序功能模块

根据设计思路,文件的压缩和解压缩是两个相反的操作,程序可分为GZIP压缩模块、UNGZIP压缩模块。现在设计出功能结构图如图。

1.2 模块分析与流程图

分析程序的总体流程图可以以图来表示:

1.2.1 压缩模块

压缩模块的实现流程为:

  • 打开要压缩的文件,使用字典算法扫描文件统计文件使用的字符集并统计每个字符集的使用次数。

  • 根据扫描的结果构建文件字符集的Huffman树。

  • 由文件的Huffman树求字符集中各字符的编码,形成Huffman编码表。

  • 建立压缩文件。

  • 将要压缩文件的字符集大小和文件的大小写入压缩文件。将字符集的Huffman树写入压缩文件,供解压缩时使用。

  • 从文件中读取一个字符集,查Huffman编码表,得到它的Huffman编码。按位流放入压缩文件的写缓冲区。

  • 检查压缩文件的写缓冲区,如果已满一个字节,写入压缩文件,如果要压缩的文件没有达到文件的结尾,转到步骤6。

  • 关闭要压缩文件和压缩文件

流程图如图:

1.2.2 解压缩模块

解压缩模块的实现流程为:

  • 打开压缩文件,读取字符集字符个数和文件的字节数。读入文件的Huffman树。

  • 建立解压缩文件。

  • 读入一个字节的编码,用Huffman树得到字符,将字符写入解压缩文件,如果编码已用完,就读取下一个字节,如此重复,直到读取压缩文件的全部编码。

  • 关闭压缩文件和解压缩文件。

画出流程图如图:

1.3 程序中各个类的初步定义

为了完成此程序,应当设计一个接口,十四个类,和二个异常处理类。其中

接口:Checksum。

类:Adler32;CRC32;CheckedInputStream;CheckedOutputStream;Deflater;DeflaterOutputStream;GZIPInputStream;GZIPOutputStream;Inflater;InflaterInputStream;ZipEntry;ZipFile;ZipInputStream;ZipOutputStream。

异常索引:DataFormatException;ZipException。

各个类的简单介绍如表:

条目 类型 描述
Checksum 接口 被类Adler32和CRC32实现的接口
Adler32 使用Alder32算法来计算Checksum数目
CheckedInputStream 一个输入流,保存着被读取数据的Checksum
CheckedOutputStream 一个输出流,保存着被读取数据的Checksum
CRC32 使用CRC32算法来计算Checksum数目
Deflater 使用ZLIB压缩类,支持通常的压缩方式,程序核心类
DeflaterOutputStream 一个输出过滤流,用来压缩Deflater格式数据
GZIPInputStream 一个输入过滤流,读取GZIP格式压缩数据
GZIPOutputStream 一个输出过滤流,读取GZIP格式压缩数据
Inflater 使用ZLIB压缩类,支持通常的解压方式,程序核心类
InflaterInputStream 一个输入过滤流,用来解压Inflater格式的压缩数据
ZipEntry 存储ZIP条目
ZipFile 从ZIP文件中读取ZIP条目
ZipInputStream 一个输入过滤流,用来读取ZIP格式文件中的文件
ZipOutputStream 一个输出过滤流,用来向ZIP格式文件口写入文件
DataFormatException 异常类 抛出一个数据格式错误
ZipException 异常类 抛出一个ZIP文件

2 软件系统测试

2.1 运行环境

在安装了JAVA虚拟机的操作平台下即可使用。我用的是在WINDOWS XP上安装的JAVA虚拟机,版本为jdk1.5.0_06。

对于环境变量的配置:

  1. JAVA_HOME=C:\ProgramFiles\Java\jdk1.5.0_06
  2. CLASSPATH=C:\ProgramFiles\Java\jdk1.5.0_06\lib\dt.jar;.;
  3. PATH=C:\Program Files\Java\jdk1.5.0_06\bin;%JAVA_HOME%\bin

2.2 测试方法

测试过程中,先测试非法操作程序是否提醒,再对程序的压缩与解压缩是否可逆,也就是是否可以恢复文件进行测试,另外对比本程序与现在最流行的压缩软件WINRAR的压缩率。

2.3 测试结果

2.3.1 使用程序对txt文件压缩

对一个名为test.txt,大小为42.4KB的文本文档进行压缩与解压缩,压缩生成的文件为test.txt.gzip。执行方式和结果如图所示:

再将这个压缩后的文件解压缩为testRecover.txt。执行方式和结果如图所示:

解压缩后的文件与原文件大小一致,并且打开对比也是一致的,这说明程序功能上是可以实现的。计算其压缩率大约为43%,而WINRAR的压缩率也是大约43%。

若对一个非gzip压缩格式的文件进行解压缩,则会得到如图的提示:

2.3.2 使用程序对bmp图象文件压缩

对一个名为test.bmp,大小为218KB的图像文件进行压缩与解压缩,再将这个压缩后的文件解压缩为testRecover.bmp。解压缩后的文件与原文件大小一致,并且打开对比也是一致的,这说明程序功能上是可以实现的。计算其压缩率大约为77%,而WINRAR的压缩率是大约60%。

2.3.3 使用程序对doc文件压缩

对一个名为test1.doc,大小为4938KB的Word文档进行压缩与解压缩,再将这个压缩后的文件解压缩为test1Recover.doc。解压缩后的文件与原文件大小一致,并且打开对比也是一致的,这说明程序功能上是可以实现的。计算其压缩率大约为83%,而WINRAR的压缩率是大约82%。

参考文献

[1] Mark[美],Nelson[美].数据压缩技术原理与范例[M].北京:科学出版社

[2] JIURL.Gzip源码详解[OL].CSDN网站. http://dev.csdn.net/article/25/25053.shtm

[3] 郑阿奇.Java实用教程[M].北京:电子工业出版社

[4] 沈耀,郝萍,李扬.JBuilder基础开发篇[M].北京:清华大学出版社

上传的附件 cloud_download 文件压缩与解压缩.zip ( 148.20kb, 1次下载 )
error_outline 下载需要9点积分

发送私信

放空的心,是最好的礼物;独走的路,是最美的风景

9
文章数
14
评论数
最近文章
eject