基于Java的文件压缩工具的设计与实现_第1页
基于Java的文件压缩工具的设计与实现_第2页
基于Java的文件压缩工具的设计与实现_第3页
基于Java的文件压缩工具的设计与实现_第4页
基于Java的文件压缩工具的设计与实现_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、XXXXXX大学全日制普通本科生毕业设计基于Java的文件压缩工具的设计与实现FILE COMPRESSION TOOL DESIGN AND IMPLEMENTATIONBASED ON JAVA 学生姓名:学 号:年级专业及班级:指导老师及职称:学 院:提交日期:2011年5月湖南农业大学全日制普通本科生毕业论文(设计)诚 信 声 明本人郑重声明:所呈交的本科毕业论文(设计)是本人在指导老师的指导下,进行研究工作所取得的成果,成果不存在知识产权争议。除文中已经注明引用的内容外,本论文不含任何其他个人或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献的个人和集体在文中均作了明确的说明

2、并表示了谢意。本人完全意识到本声明的法律结果由本人承担。 毕业论文(设计)作者签名: 年 月 日目 录 摘要1 关键词1 1前言2 2 压缩与解压缩程序分析3 2.1需求分析 3 2.2使用的算法理论3 2.2.1 LZ77算法 3 2.2.2 Huffman算法4 2.2.3 GZIP 算法4 2. 3 开发环境5 3 总体设计5 3.1 程序功能模块5 3.2 模块分析与流程图6 3.2.1 压缩模块6 3.2.2 解压缩模块7 3.3 程序中各个类的初步定义8 4 详细的设计和实现8 4.1 压缩程序流程8 4.2 解压缩程序流程9 4.3 函数代码10 4.3.1 压缩模块10 4.3

3、.2 解压缩模块11 4.3.3 主函数12 4.4 程序界面设计13 5 产品的测试18 5.1 运行环境18 5.2 测试方法18 5.3 测试结果19 5.3.1 对txt文件压缩19 5.3.2 对bmp图象文件压缩19 5.3.3 对doc文件压缩19 6 结论19 基于Java的文件压缩工具的设计与实现学 生: 指导老师:( 大学 学院,)摘 要:随着科学技术的发展特别是互联网的崛起,人们对于信息、数据的需求以及计算机使用时间的日益增加,电脑磁盘上的资料、数据越来越多。如何让有限的磁盘存储空间容纳更多的数据、资料已成为人们越来越关注且亟待解决的问题。在如今的信息时代,人们普遍通过网

4、络下载或上传文件等信息,在网络传输文件的过程中,如果文件过大将会影响文件的传输的效果和速度。在这两方面问题的推动下,人们对数据压缩的需求就产生了。本论文主要研究数据、文件的无损压缩技术,同时介绍了压缩的分类、几种常用的无损压缩格式和常用的压缩算法,并且详细分析了文件压缩和解压缩的具体流程、实现方法。本程序运用了LZ77字典算法、懒惰匹配算法、Huffman编码算法以及GZIP算法,在Eclipse环境下使用Java语言编写代码,设计并实现文件压缩工具。关键词:数据压缩;解压缩;JavaFile Compression Tool Design and Implementation Based o

5、n JavaStudent:Tutor:(College of Information science and technology, Hunan Agricultural University, Changsha 410128, China)Abstract: With the progress of science and technology, especially the development of the Internet ,peoples demand of information and data is on the rise. How to make the limited

6、disk storge space hold more data and information is becoming a great issue which draws a growing number of peoples attention,and it is expected to be resolved. In this information era, people generally download or upload files through the Internet ,the speed of the process may be adversely affected

7、if the file is too large.Driven by the two problems,the demand for file and data compression from consumers is come into being.This paper mainly discussed the lossless compession of data and files,and at the same time it introduced the classcifications of compression, several commonly used lossless

8、compression formats and some commom compression algorithms,and analyzed specific process and implementation of compression and decompression of files.Using java language in the Eclipse environment,this program applies LZ77 dictionary algorithm, lazy matching algorithm, Huffman coding algorithm and G

9、ZIP algorithm in the proess of designing and implementing file compression tool. Key words: Compression; Decompression; Java1 前言 随着科学技术的进步,尤其是计算机互联网的发展,信息技术越来越普遍地应用到社会的各个行业和领域,并且深刻地影响和改变着人们的生活方式,推动着人类文明的进步。在如今的信息时代,信息技术广泛的覆盖了社会的各个领域,普及到社会的各个方面,这不仅能提高工作效率,也使日常生活更为方便,娱乐活动更加的丰富多彩。但是,在信息技术的高速速发展同时,文件、数据

10、的信息量不断增加,而硬盘存储空间有限,这就要求我们在能够保持数据的意思不变的情况下将其缩小而占用更小的空间。为了达到此目的,我们需用压缩与解压缩来实现1。文件压缩格式现在已有许多种,最流行的有如下几种: ZIP:我们可以利用 WinZip 对 ZIP 文件进行解压、释放等操作,还可以用它来处理 ARJ、ARC、CAB、LZH 等多种不同格式的压缩文件,从而大大地方便了用户的操作。 RAR:是一种高效快速的文件压缩格式,但不被大多数文件压缩程序支持。WinRAR 是在 Windows 下处理 RAR 格式文件的最好工具。 ARJ:由 DOS 下曾经红极一时的压缩软件 ARJ 压缩而成的文件格式,

11、它具有功能强大、压缩率高等优点。到了现在的 Windows 时代,它已经没有了往日的辉煌。 CAB:是 Windows 98 新增的一种特殊压缩文件格式,主要用于对有关软件安装盘中的文件进行压缩,其特点是压缩率非常高(可能是目前最高的),但一经压缩就不能再进行任何增加、删除、替换等修改,也就是说它的压缩包具有只读属性。我们也可使用 WinZip 对 CAB 压缩包进行操作。 UU/UUE:汉字编码方式,它们原本是 Unix 系统中使用的一种编码方式,后来被改写到 DOS 中,我们在传送中文邮件时只须事先使用该方式进行编码,此后就能顺利通过只能处理 7 位编码的邮件服务器,从而解决了汉字的传输问

12、题。 ACE:一种新式的压缩程序,压缩比很高。 以上的压缩格式是可逆的,在解压缩之后,可以将被压缩的文件还原成以前未压缩的文件。另外还有一种不可逆的压缩格式,如 MP3、MPEG、JPG 等音频、视频、图像格式的文件都采用了这种压缩技术,从理论上来说它们也应该算压缩文件,不过它们所采用的压缩方式与前面讲的并不相同,这里简单地介绍一下: JPEG:JPEG 全名为 Joint Photographic Experts Group,它是一个在国际标准组织(ISO)下从事静态影像压缩标准制定的委员会。它制定出了第一套国标准静态影像压缩标准:ISO 10918-1 就是我们俗称的JPEG 了。由于JP

13、EG 优良的品质,使得它在短短的几年内就获得极大的成功,目前网站上 80%的影像都是采用JPEG 的压缩标准。 JPEG 2000:正式名称为ISO 15444,同样是由 JPEG 组织负责制定。JPEG2000与传统 JPEG 最大的不同,在于它放弃了 JPEG 所采用的以离散余弦转换为主的区块编码方式,而改以小波转换为主的多解析编码方式。其压缩率比 JPEG高约 30%左右,同时支持有损和无损压缩,无损压缩对保存一些重要图片十分有用。 MP3:MP3 全称是 MPEG 1 Layer 3,是一种高性能的声音压缩编码方案,它可以做出超小体积的音乐文件,大小只是原始音频数据的 1/10 到 1

14、/12。但人耳听起来,效果却没有太大差异。 MPEG:MPEG 是 Moving Pictures Experts Group(动态图像专家组)的缩写。现在使用的有 4 个版本:MPEG-1、MPEG-2、MPEG-3、MPEG-42。2 压缩与解压缩程序分析2.1 需求分析文件的压缩与解压缩,要能方便地进行,要完成的功能包括压缩功能,解压缩功能,选择文件路径,选择操作方案,选择新文件保存路径。此程序还要在压缩成功后显示被压缩文件的大小,并对非法操作给出提示。 用户可以选择文件进行压缩或解压缩操作,并选择生成保存路径,默认的保存路径为原文件目录,压缩的生成文件以原文件加.gzip 后缀命名,在

15、解压缩操作中,若输入文件不是 gzip 格式的压缩文件,则提示 gzip 文件格式不对。程序的基本设计原则有:方便性原则、功能实用性原则和开放性原则等。程序设计时采用较好的压缩技术,能保证文件压缩的压缩比和可恢复性,确保程序较长的生命周期。 本程序的总体目标是实现文件压缩与解压缩的便捷操作,因此需要有便捷的操作界面3。2.2 使用的算法理论2.2.1 LZ77 算法这一算法是由 Jacob Ziv 和 Abraham Lempel 于 1977 年提出,所以命名为LZ77。这种算法模型也被称为滑动字典模型或滑动窗口模型。在最远匹配位置和当前处理位置之间是可以用来查找匹配的字典区域,随着压缩的进

16、行,字典区域从待压缩文件的头部不断地向后滑动,直到达到 文件的尾部,短语式压缩也就结束了4。2.2.2 Huffman算法David Albert Huffman(哈夫曼/赫夫曼/霍夫曼)在 MIT 攻读博士学位期间于 1952 年提出了一种从下到上的编码方法,现在被称为 Huffman 编码,它是一种统计最优的变码长符号编码,让最频繁出现的符号具有最短的编码.Huffman 编码的过程具体编码步骤为: (1)将符号按概率从小到大顺序从左至右排列叶节点; (2)连接两个概率最小的顶层节点来组成一个父节点,并在到左右子节点的两条连线上分别标记 0 和 1; (3)重复步骤 2,直到得到根节点,形

17、成一棵二叉树; (4)从根节点开始到相应于每个符号的叶节点的 0/1 串,就是该符号的二进制编码。 由于符号按概率大小的排列既可以从左至右、又可以从右至左,而且左右分枝哪个标记为 0 哪个标记为 1 是无关紧要的,所以最后的编码结果可能不唯一,但这仅仅是分配的代码不同,而代码的平均长度是相同的。 编码式压缩利用各个单字节使用频率不一样的倾向,使定长编码变为不定长编码,给使用频率高的字节更短的编码,使用频率低的字节更长的编码,起到压缩的效果。由于 Huffman 编码为根结点到叶子结点路径上的 0 和 1 的序列,而一个叶子结点的路径不可能是另一个叶子结点路径的前缀,因此一个 Huffman 编

18、码不可能为另一个 Huffman 编码的前缀,这就保证了 Huffman 编码是可以区分的。由于用 Huffman 算法建立起来的树总是一棵最优二叉树,因此这又让 Huffman编码能够实际应用到压缩中5。2.2.3 GZIP 算法GZIP 使用 deflate 算法进行压缩。zlib,以及图形格式 png,使用的压缩算法也是 deflate 算法。GZIP 对于要压缩的文件,首先使用 LZ77 算法的一个变种进行压缩,对得到的结果再使用 Huffman 编码的方法(GZIP 根据情况,选择使用静态 Huffman 编码或者动态 Huffman 编码)进行压缩。LZ77 算法和 Huffman

19、编码结合起来,就是 deflate 算法的根本实现方法,也就是 GZIP 的压缩原理6。懒惰匹配(lazy match)是 GZIP 中对 LZ77 算法的改进,实现过程如下:在压缩过程中,对于当前字节开始的串,寻找到了最长匹配之后,GZIP并不立即决定使用这个串进行替换。而是看看这个匹配长度是否满意,如果匹配长度不满意,而下一个字节开始的串也有匹配串的话,那么 GZIP 就找到下一个字节开始的串的最长匹配,看看是不是比现在这个长。这就是懒惰匹配7。 如果比现在这个长的话,将不使用现在的这个匹配。如果比现在这个短的话,将确定使用现在的这个匹配。发现第二次匹配的匹配长度大,就不使用第一次的匹配串

20、。如果直接使用第一次匹配的话,有可能将错过更长的匹配串。 在满足懒惰匹配的前提条件下,懒惰匹配不限制次数,一次懒惰匹配发现了更长的匹配串之后,仍会再进行懒惰匹配,如果这次懒匹配,发现了更长的匹配串,那么上一次的懒匹配找到的匹配串就不用了8。 进行懒惰匹配是有条件的。进行懒惰匹配必须满足两个条件,第一,下一个处理字节开始的串,要有匹配串,如果下一个处理字节开始的串没有匹配串的话,那么就确定使用当前的匹配串,不进行懒惰匹配。第二,当前匹配串的匹配长度,GZIP 不满意,也就是当前匹配长度小于 max_lazy_match(max_lazy_match 在固定的压缩级别下,有固定的值)9。2.3 开

21、发环境使用Eclipse进行程序开发。Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台10。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。3 总体设计系统总体结构设计是系统设计过程中及其重要的一步,对系统的技术层次,开发过程,功能实现及开发成本方面具有重大的影响。系统总统结构设计应尽可能的考虑人机关系,环境条件以及算法的可行性等的联系,使系统每个部分都能协调适应。本实验论证是基于 GZIP 算法理论体系的,因此使用的压缩

22、方法是参照 GZIP算法的。GZIP 算法理论体系主要包含三个内容:LZ77 算法,Huffman 算法,懒惰匹配算法11。因此在设计过程中要注意如何实现这三个算法并且将其结合起来。3.1 程序功能模块根据设计思路,文件的压缩和解压缩是两个相反的操作,程序可分为 GZIP压缩模块、UNGZIP压缩模块12。3.2 模块分析与流程图 模块分析与流程图如下如所示:开 始 N是压缩吗Y 文件解压缩文件压缩结 束 图1 总体流程图Fig 1 System flowchart3.2.1 压缩模块压缩模块的实现流程为: (1)打开要压缩的文件,使用字典算法扫描文件统计文件使用的字符集并统计每个字符集的使用

23、次数。 (2)根据扫描的结果构建文件字符集的 Huffman 树。 (3)由文件的 Huffman 树求字符集中各字符的编码,形成 Huffman 编码表。 (4)建立压缩文件。(5)将要压缩文件的字符集大小和文件的大小写入压缩文件。将字符集的Huffman 树写入压缩文件,供解压缩时使用。 (6)从文件中读取一个字符集,查 Huffman 编码表,得到它的 Huffman 编码。按位流放入压缩文件的写缓冲区。 (7)检查压缩文件的写缓冲区,如果已满一个字节,写入压缩文件,如果要压缩的文件没有达到文件的结尾,转到步骤 6。 (8)关闭要压缩文件和压缩文件13流程图如下:入口统计文件字符集和频次

24、构建文件的哈夫曼树建立文件的哈夫曼编码将文件压缩信息写入压缩文件读取文件中字符转换为编码写入压缩文件出口图2 压缩模块流程图Fig 2 Compression module flowchart3.2.2 解压缩模块解压缩模块的实现流程为: (1)打开压缩文件,读取字符集字符个数和文件的字节数。读入文件的Huffman树。 (2)建立解压缩文件。 (3)读入一个字节的编码,用 Huffman 树得到字符,将字符写入解压缩文件,如果编码已用完,就读取下一个字节,如此重复,直到读取压缩文件的全部编码。(4)关闭压缩文件和解压缩文件14。流程图如下:图区源文件的相关信息读图文件中的编码转换为字符写入解

25、压缩文件入口出口图3 解压缩模块流程图Fig 3 Decompression module flowchart3.3 程序中各个类的初步定义为了完成此程序,应当设计一个接口,十四个类,和二个异常处理类。其中接口:Checksum15。 类:Adler32;CRC32;CheckedInputStream;CheckedOutputStream;Deflater; DeflaterOutputStream ; GZIPInputStream ; GZIPOutputStream ; Inflater ; InflaterInputStream;ZipEntry;ZipFile;ZipInputS

26、tream;ZipOutputStream。异常索引:DataFormatException;ZipException16。4 详细设计和实现4.1 压缩的程序流程 压缩程序的实现过程中,涉及到很多类的调用,除了压缩有关的类,还有IO 类17。对于 IO 类的调用不考虑的情况下,各个压缩功能类的调用流程: (1)主程序 gzip 调用输出过滤流 GZIPOutputStream,读取 GZIP 格式压缩数据,压缩开始。 (2)GZIPOutputStream 调用 CRC32 来计算 Checksum 的数目。 (3)在 CRC32 返回结果后,GZIPOutputStream 调用 Defl

27、ater 压缩类来进行压缩。在 Deflater 类的调用过程中,实现了对数据的压缩字符集确定与编码,也就是实现了 LZ77 算法、懒惰匹配与 Huffman 编码的结合。 (4)建立压缩文件,调用 DeflaterOutputStream 来压缩 Deflater 格式数据18。GzipGZIPOutputstreamDeflaterDeflateroutputstreamCRC32Checksum图4 压缩类调用顺序图Fig 4 Compression class invocation sequence diagram这些过程的操作是不能离开 IO 类的,所以实现这些过程的前提是要有数据流

28、输入,也就是调用 FileInputStream,打开需压缩文件作为文件输入流19;在以上的流程完毕之后,调用 FileOutputStream 类建立压缩文件输出流,最终形成压缩后的文件。4.2 解压缩的程序流程 在解压缩的实现过程中,各个类的调用关系: (1)主程序 ungzip 调用 GZIPInputStream,读取 GZIP 格式压缩数据,解压缩开始。 (2)GZIPInputStream 调用 CRC32 来计算 Checksum 的数目。 (3)在 CRC32 返回结果后,调用 CheckedInputStream 保存被读取数据的 Checksum,同时调用 Inflater

29、 进行解压缩。 (4)在 Inflater 解压缩过程中,如果数据格式错误,则调用DataFormatException;如果没有数据格式错误,则调用 InflaterInputStream来解压 Inflater格式的压缩数据20。unzipChecksumCRC32GZIPInputstreamCheckedInputstreamInflaterChecksumInflaterInputstreamDataFormatExceptionZipException图5 解压缩类调用顺序图Fig 5 Decompression class invocation sequence diagram4

30、.3 函数代码4.3.1 gzip 压缩模块代码 压缩模块要完成的就是将文件读入以后进行压缩,再将压缩后的数据写入一 个新的文件,其部分代码如下: package comAndUncom;import java.io.*;import java.util.zip.*;public class gzip public gzip(File infile,String outfile)try /打开需压缩文件作为文件输入流 FileInputStream fin=new FileInputStream(infile); /建立压缩文件输出流 FileOutputStream fout=new Fil

31、eOutputStream(outfile); /建立gzip压缩输出流 GZIPOutputStream gzout=new GZIPOutputStream(fout); byte buf=new byte1024;/设定读入缓冲区尺寸 int num; while (num=fin.read(buf) != -1) gzout.write(buf,0,num); gzout.close();/关闭流,必须关闭所有输入输出流.保证输入输出完整和释放 系统资源. fout.close(); fin.close(); catch(IOException e) System.out.printl

32、n(e); 4.3.2 ungzip 解压缩模块代码 解压缩模块要完成的就是将文件读入以后进行解压缩,再将解压缩后的数据写入一个新的文件,其部分代码如下:package comAndUncom;import java.io.*;import java.util.zip.*;public class ungzip public ungzip(File infile,String outfile)try /建立gzip压缩文件输入流 FileInputStream fin=new FileInputStream(infile); /建立gzip解压工作流 GZIPInputStream gzin=

33、new GZIPInputStream(fin); /建立解压文件输出流 FileOutputStream fout=new FileOutputStream(outfile); byte buf=new byte1024; int num; while (num=gzin.read(buf,0,buf.length) != -1) fout.write(buf,0,num); gzin.close(); fout.close(); fin.close(); catch(IOException e) System.out.println(e); 4.3.3 主函数代码package userI

34、nterface;public class MainFunction public static void main(String args) /实例化窗口类gzipJFrame inst = new gzipJFrame(); /使窗口可见inst.setVisible(true); 4.4 程序界面设计为了让用户能便捷地进行压缩与解压缩的操作,还要对程序加入一个可视化界面。其外观如下:图6 程序界面Fig 6 Program interface用户首先选择需要操作的文件,若要将被操作文件的生成文件保存到原文件所在目录,可以跳过选择输出文件夹操作。在选择好文件以后,用户根据自己的需要,点击压

35、缩或者解压按钮,操作便完成。其部分代码如下:package userInterface;import java.awt.*;import java.util.zip.*;import java.awt.event.*;import java.io.*;import javax.swing.*;public class gzipJFrame extends JFrame implements ActionListener File file=null; File dir=null; private JToggleButton jToggleButton1; private JMenu jMenu

36、1; private JMenuItem jMenuItem1; private JLabel jLabel2; private JLabel jLabel1; private JMenuItem jMenuItem2; private JMenuBar jMenuBar1; private JToggleButton jToggleButton2; private static final String initstate=请先选择文件; JFileChooser chooserfile=new JFileChooser(); JFileChooser chooserDir=new JFil

37、eChooser(); private JMenuItem jMenuItem3; public gzipJFrame() super(); initGUI(); private void initGUI() try this.setTitle(gzip压缩与解压缩); this.setLocation(280,240); GridLayout thisLayout = new GridLayout(3,1); getContentPane().setLayout(thisLayout); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_

38、CLOSE); /菜单栏jMenuBar1 = new JMenuBar(); setJMenuBar(jMenuBar1); jMenuBar1.setPreferredSize(new java.awt.Dimension(331, 19); jMenu1 = new JMenu(); jMenuBar1.add(jMenu1); jMenu1.setText(文件); jMenuItem1 = new JMenuItem(); jMenu1.add(jMenuItem1); jMenuItem1.setText(打开); jMenuItem1.addActionListener(this

39、);jMenuItem2 = new JMenuItem(); jMenu1.add(jMenuItem2); jMenuItem2.setText(退出); jMenuItem2.addActionListener(this); jMenuItem3 = new JMenuItem(); jMenu1.add(jMenuItem3); jMenuItem3.setText(u8f93u51fau6587u4ef6u5939); jMenuItem3.addActionListener(this); jLabel1 = new JLabel(); jLabel1.setText(initsta

40、te); getContentPane().add(jLabel1); jLabel1.setPreferredSize(new java.awt.Dimension(280, 28); jToggleButton1 = new JToggleButton(); getContentPane().add(jToggleButton1); jToggleButton1.setText(u538bu7f29); jToggleButton1.setPreferredSize(new java.awt.Dimension(63, 21); jToggleButton1.addActionListen

41、er(this); jToggleButton2 = new JToggleButton(); getContentPane().add(jToggleButton2); jToggleButton2.setText(u89e3u538b); jToggleButton2.setPreferredSize(new java.awt.Dimension(63, 21); jToggleButton2.addActionListener(this); JPanel buttonPanel = new JPanel();buttonPanel.setLayout(new FlowLayout();b

42、uttonPanel.add(jToggleButton1);buttonPanel.add(jToggleButton2);getContentPane().add(buttonPanel); jLabel2 = new JLabel(); getContentPane().add(jLabel2); jLabel2.setPreferredSize(new java.awt.Dimension(322, 21); pack(); this.setSize(339, 164); catch (Exception e) e.printStackTrace(); public void acti

43、onPerformed(ActionEvent arg0) if(arg0.getSource()=jToggleButton1) String save=; if(dir!=null) save=dir.getAbsolutePath()+/+file.getName()+.gzip; else save=file.getName()+.gzip; if(file.getName().lastIndexOf(gzip)0) comAndUncom.ungzip g=new comAndUncom.ungzip(file.getAbsoluteFile(),save); jLabel2.setText(状态:解压成功); else jLabel2.setText(状态:文件格式不对); if(arg0.getSource()=jMenuItem1) int state =chooserfile.showOpenDialog(null); file=chooserfile.getSelectedFile(); /System.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论