【免费毕设】JAVA文件压缩与解压缩实践(源代码+论文)
系统总体结构设计是系统设计过程中及其重要的一步,对系统的技术层次,开发过程,功能实现及开发成本方面具有重大的影响。系统总统结构设计应尽可能的考虑人机关系,环境条件以及算法的可行性等的联系,使系统每个部分都能协调适应。
本实验论证是基于GZIP算法理论体系的,因此使用的压缩方法是参照GZIP算法的。GZIP算法理论体系主要包含三个内容:LZ77算法,Huffman算法,懒惰匹配算法。因此在设计过程中要注意如何实现这三个算法并且将其结合起来。
3.1程序功能模块
根据设计思路,文件的压缩和解压缩是两个相反的操作,程序可分为GZIP压缩模块、UNGZIP压缩模块。现在设计出功能结构图如图3。
3.2.1 压缩模块
压缩模块的实现流程为:
(1)打开要压缩的文件,使用字典算法扫描文件统计文件使用的字符集并统计每个字符集的使用次数。
(2)根据扫描的结果构建文件字符集的Huffman树。
(3)由文件的Huffman树求字符集中各字符的编码,形成Huffman编码表。
(4)建立压缩文件。
(5)将要压缩文件的字符集大小和文件的大小写入压缩文件。将字符集的Huffman树写入压缩文件,供解压缩时使用。
(6)从文件中读取一个字符集,查Huffman编码表,得到它的Huffman编码。按位流放入压缩文件的写缓冲区。
(7)检查压缩文件的写缓冲区,如果已满一个字节,写入压缩文件,如果要压缩的文件没有达到文件的结尾,转到步骤6。
(8)关闭要压缩文件和压缩文件
3.2.1 解压缩模块
解压缩模块的实现流程为:
(1)打开压缩文件,读取字符集字符个数和文件的字节数。读入文件的Huffman树。
(2)建立解压缩文件。
(3)读入一个字节的编码,用Huffman树得到字符,将字符写入解压缩文件,如果编码已用完,就读取下一个字节,如此重复,直到读取压缩文件的全部编码。
(4)关闭压缩文件和解压缩文件。
3.1程序中各个类的初步定义
为了完成此程序,应当设计一个接口,十四个类,和二个异常处理类。其中
接口:Checksum。
类:Adler32;CRC32;CheckedInputStream;CheckedOutputStream;Deflater;DeflaterOutputStream;GZIPInputStream;GZIPOutputStream;Inflater;InflaterInputStream;ZipEntry;ZipFile;ZipInputStream;ZipOutputStream。
异常索引:DataFormatException;ZipException。
压缩程序的实现过程中,涉及到很多类的调用,除了压缩有关的类,还有IO类。对于IO类的调用不考虑的情况下,各个压缩功能类的调用流程(如图7):
(1)主程序gzip调用输出过滤流GZIPOutputStream,读取GZIP格式压缩数据,压缩开始。
(2)GZIPOutputStream调用CRC32来计算Checksum的数目。
(3)在CRC32返回结果后,GZIPOutputStream调用Deflater压缩类来进行压缩。在Deflater类的调用过程中,实现了对数据的压缩字符集确定与编码,也就是实现了LZ77算法、懒惰匹配与Huffman编码的结合。
(4)建立压缩文件,调用DeflaterOutputStream来压缩Deflater格式数据。
这些过程的操作是不能离开IO类的,所以实现这些过程的前提是要有数据流输入,也就是调用FileInputStream,打开需压缩文件作为文件输入流;在以上的流程完毕之后,调用FileOutputStream类建立压缩文件输出流,最终形成压缩后的文件。
4.1解压缩的程序流程
在解压缩的实现过程中,各个类的调用关系(如图8):
(1)主程序ungzip调用GZIPInputStream,读取GZIP格式压缩数据,解压缩开始。
(2)GZIPInputStream调用CRC32来计算Checksum的数目。
(3)在CRC32返回结果后,调用CheckedInputStream保存被读取数据的Checksum,同时调用Inflater进行解压缩。
(4)在Inflater解压缩过程中,如果数据格式错误,则调用DataFormatException;如果没有数据格式错误,则调用InflaterInputStream来解压Inflater格式的压缩数据。
4.1主函数代码
4.3.1 gzip压缩模块代码
压缩模块要完成的就是将文件读入以后进行压缩,再将压缩后的数据写入一个新的文件,其部分代码如下:
publicclass gzip
{
publicstatic void main(String[] args)
{
if(args.length !=2)
{
System.out.println("Usage:javagzip ");
System.exit(1);
}
try
{
//打开需压缩文件作为文件输入流
FileInputStreamfin=new FileInputStream(args[0]);
//建立压缩文件输出流
FileOutputStreamfout=new FileOutputStream(args[1]);
//建立gzip压缩输出流
GZIPOutputStreamgzout=new GZIPOutputStream(fout);
byte[]buf=new byte[1024];//设定读入缓冲区尺寸
intnum;
while((num=fin.read(buf)) != -1)
{
gzout.write(buf,0,num);
}
gzout.close();//关闭流,必须关闭所有输入输出流.保证输入输出完整和释放系统资源.
fout.close();
fin.close();
}catch(IOExceptione)
{
System.out.println(e);
}
}
}
4.3.2 ungzip解压缩模块代码
解压缩模块要完成的就是将文件读入以后进行解压缩,再将解压缩后的数据写入一个新的文件,其部分代码如下:
publicclass ungzip
{
publicstatic void main(String[] args)
{
if(args.length !=2)
{
System.out.println("Usage:javaungzip ");
System.exit(1);
}
try
{
//建立gzip压缩文件输入流
FileInputStreamfin=new FileInputStream(args[0]);
//建立gzip解压工作流
GZIPInputStreamgzin=new GZIPInputStream(fin);
//建立解压文件输出流
FileOutputStreamfout=new FileOutputStream(args[1]);
byte[]buf=new byte[1024];
intnum;
while((num=gzin.read(buf,0,buf.length)) != -1)
{
fout.write(buf,0,num);
}
gzin.close();
fout.close();
fin.close();
}catch(IOExceptione)
{
System.out.println(e);
}
}
}
4.2程序界面设计
为了让用户能便捷地进行压缩与解压缩的操作,还要对程序加入一个可视化界面。其外观如图9:
详情请关注小编继续了解,免费赠送源代码与论文哦!
计算机毕业设计(源程序+论文+开题报告+文献综述+翻译+答辩稿)
联系QQ:2932963541进行咨询