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

课题背景

随着科学技术的进步,信息技术越来越广泛地应用到社会的各个行业和领域,互联网深刻地改变着人们的生活方式,推动着人类文明的进步。伴随着信息技术的普及和发展,互联网技术覆盖了社会政治、经济、文化、生产的各个领域,这种普及日常生活和工作更加的方便、文化娱乐方式更加的多样化。但是,在信息技术的飞速发展下,文件的信息量不断增加的背景下,文件的存储和拷贝要求能够保持数据的意思不变的情况下缩小容量,这就需要有压缩与解压缩来实现这个过程。本论文通过对一种压缩与解压缩方法的实践,对这种算法的实现过程进行研究。

​​​​​​​国内外现有的研究成果

文件压缩格式现在已有许多种,最流行的有如下几种:

ZIP:我们可以利用WinZip对ZIP文件进行解压、释放等操作,还可以用它来处理ARJ、ARC、CAB、LZH等多种不同格式的压缩文件,从而大大地方便了用户的操作。

RAR:是一种高效快速的文件压缩格式,但不被大多数文件压缩程序支持,WinRAR是在Windows下处理RAR格式文件的最好工具。

ARJ:由DOS下曾经红极一时的压缩软件ARJ压缩而成的文件格式,它具有功能强大、压缩率高等优点。到了现在的Windows时代,它已经没有了往日的辉煌。

CAB:是Windows 98新增的一种特殊压缩文件格式,主要用于对有关软件安装盘中的文件进行压缩,其特点是压缩率非常高(可能是目前最高的),但一经压缩就不能再进行任何增加、删除、替换等修改,也就是说它的压缩包具有“只读”属性。我们也可使用WinZip对CAB压缩包进行操作。

UU/UUE:汉字编码方式,它们原本是Unix系统中使用的一种编码方式,后来被改写到DOS中,我们在传送中文邮件时只须事先使用该方式进行编码,此后就能顺利通过只能处理7位编码的邮件服务器,从而解决了汉字的传输问题。

ACE:一种新式的压缩程序,压缩比很高。

以上的压缩格式是可逆的,在解压缩之后,可以将被压缩的文件还原成以前未压缩的文件。另外还有一种不可逆的压缩格式,如MP3、MPEG、JPG等音频、视频、图像格式的文件都采用了这种压缩技术,从理论上来说它们也应该算压缩文件,不过它们所采用的压缩方式与前面讲的并不相同,这里简单地介绍一下:

JPEG:JPEG 全名为 Joint Photographic Experts Group,它是一个在国际标准组织(ISO)下从事静态影像压缩标准制定的委员会。它制定出了第一套国标静态影像压缩标准:ISO 10918-1 就是我们俗称的JPEG了。由于JPEG优良的品质,使得它在短短的几年内就获得极大的成功,目前网站上80%的影像都是采用JPEG的压缩标准。

JPEG 2000:正式名称为“ISO 15444”,同样是由JPEG组织负责制定。JPEG 2000与传统JPEG最大的不同,在于它放弃了JPEG所采用的以离散余弦转换为主的区块编码方式,而改以小波转换为主的多解析编码方式。其压缩率比JPEG高约30%左右,同时支持有损和无损压缩,无损压缩对保存一些重要图片十分有用。

MP3:MP3全称是MPEG 1 Layer 3,是一种高性能的声音压缩编码方案,它可以做出超小“体积”的音乐文件,大小只是原始音频数据的1/10到1/12。但人耳听起来,效果却没有太大差异。

MPEG:MPEG是Moving Pictures Experts Group(动态图像专家组)的缩写。现在使用的有4个版本:MPEG-1、MPEG-2、MPEG-3、MPEG-4。

需求分析

文件的压缩与解压缩,要能方便地进行,要完成的功能包括压缩功能,解压缩功能,选择文件路径,选择操作方案,选择新文件保存路径。此程序还要在压缩成功后显示被压缩文件的大小,并对非法操作给出提示。

用户可以选择文件进行压缩或解压缩操作,并选择生成保存路径,默认的保存路径为原文件目录,压缩的生成文件以原文件加.gzip后缀命名,在解压缩操作中,若输入文件不是gzip格式的压缩文件,则提示gzip文件格式不对。

程序的基本设计原则有:方便性原则、功能实用性原则和开放性原则等。程序设计时采用较好的压缩技术,能保证文件压缩的压缩比和可恢复性,确保程序有较长的生命周期。

本程序的总体目标是实现文件压缩与解压缩的便捷操作,因此需要有便捷的操作界面。

​​​​​​​分析与流程图

根据设计思路,文件的压缩和解压缩是两个相反的操作,程序可分为GZIP压缩模块、UNGZIP压缩模块。

基于JAVA的文件压缩与解压缩实践(源代码+论文)-LMLPHP

压缩模块

压缩模块的实现流程为:

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

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

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

(4)建立压缩文件。

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

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

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

(8)关闭要压缩文件和压缩文件

基于JAVA的文件压缩与解压缩实践(源代码+论文)-LMLPHP

压缩模块代码

public class gzip 
{ 
public static void main(String[] args) 
{ 
if (args.length !=2) 
{ 
System.out.println("Usage:java gzip "); 
System.exit(1); 
} 
try 
{ 
//打开需压缩文件作为文件输入流 
FileInputStream fin=new FileInputStream(args[0]); 
//建立压缩文件输出流 
FileOutputStream fout=new FileOutputStream(args[1]); 
//建立gzip压缩输出流 
GZIPOutputStream gzout=new GZIPOutputStream(fout); 
byte[] buf=new byte[1024];//设定读入缓冲区尺寸 
int num; 

while ((num=fin.read(buf)) != -1) 
{ 
gzout.write(buf,0,num); 
} 
gzout.close();//关闭流,必须关闭所有输入输出流.保证输入输出完整和释放系统资源. 
fout.close(); 
fin.close(); 
}catch(IOException e) 
{ 
System.out.println(e); 
} 
} 
} 

完整文章及代码下载:https://download.csdn.net/download/aszhangwendi/88878756

03-06 10:53