`
lixinye0123
  • 浏览: 323647 次
  • 性别: Icon_minigender_1
  • 来自: 温州
社区版块
存档分类
最新评论

使用Java API压缩和解压缩数据

    博客分类:
  • Java
阅读更多

许多资料来源中都含有多余数据或对存储信息无用的数据。这常常造成客户机 和服务器应用程序间或电脑间浩如烟海的数据传输。很明显,数据存储和信息传 输问题解决办法是,安装辅助存储装置并扩展现有的通信设备。然而,要做到这 一点,就需要增加组织的运行费用。减轻部分数据存储和信息传输的方法之一是, 以更有效的代码表示数据。本文简要介绍数据压缩和解压缩,以及如何有效地、方便地从JavaTM应用程序内部使用 java.util.zip包压缩和解压缩数据。

虽然 WinZip、gzip和Java ARchive(或 jar)等工具可以用来压缩和解压缩数据,这些工具仍被用作独立 的应用程序。从 Java 应用程序中可以调用这些工具,但并非是简捷有效的解决 方法。在希望迅速地(如在传输到远程机器之前)压缩和解压缩数据的情况下, 尤其如此。本文将:

简要综述数据压缩

描述java.util.zip包

介绍如何使用这些包压缩和解压缩数据

介绍如何压缩和解压缩已序列化的对象以节省磁盘空间

介绍如何迅速压缩和解压缩数据,以提高客户/服务器应用程序的性能

概述数据压缩

文件冗余最单一的类型是字符的重复。例如,下列字符串:

BBBBHHDDXXXXKKKKWWZZZZ

可以更简洁地对本字符串进行编码,方法是以重复字符和代表其重复次数的数 字代替每个重复字符串。因此,上述字符串可以编码为:

4B2H2D4X4K2W4Z

这里的" 4B "表示4个B,而2H表示2个H,等等。以这种方法压缩字符串的编码 方式叫做运行长度编码。

另一个例子,是矩形图像存储。因为是单色位图图像,所以按图表1所示存储。

图表1∶带运行长度编码信息的位图

第二种方法是将图像存为图解元文件∶

矩形11、3、20、5

它表示,该矩形起始坐标是(11, 3),宽度是 20 像素,长度是 5 像素。

矩形图像可以通过计算相等字节的方式,以运行长度编码进行压缩,如下:

0, 40

0, 40

0,10 1,20 0,10

0,10 1,1 0,18 1,1 0,10

0,10 1,1 0,18 1,1 0,10

0,10 1,1 0,18 1,1 0,10

0,10 1,20 0,10

0,40

上面的第一行表示,位图的第一行由40个0组成。第三行表示,位图的第三行 由10个0组成,继之以20个1、10个0组成,诸如此类。 gigi_miao

注意,运行长度编码要求对其文件及其编码版本分别表示。所以,本方法不 适用于所有文件。其他的压缩技术包括变长编码(亦称霍夫曼编码)和等其它编 码。更多信息,请参看数据和影象压缩技术的相关书籍。

数据压缩的好处很多。不过,基本的好处是减少存储需求。此外,对于数据 通信,通过介质传递压缩数据会导致信息传输率的增加。注意,数据压缩可以 在现有的硬件上通过软件或采用结合了压缩技术的专门硬件设备完成。图形2显 示了基本的数据压缩方块图。

图形2∶数据压缩方块图

ZIP vs. GZIP

如果使用的是 Windows,就会很熟悉 WinZip 工具,该工具用来创建压缩文 件和从压缩文件中提取文件。不过,在UNIX上,细节有些有点不一样。tar 命令 用来创建文件(非压缩),而另一个程序(gzip或压缩)用来压缩 文件。

WinZip和PKZIP之类的工具既用作归档器,也用 作压缩器。它们将文件压缩并存储在文档中。另一方面,gzip并不 存档文件。因此,在 UNIX 上,tar命令通常用来创建文档,然后 用gzip命令来压缩存档文件。

java.util.zip 包

Java 为兼容 zip 的数据压缩提供 java.util.zip包。它提供 允许读取、创建并修改ZIP和GZIP文件格式的类。此外,提供用于计算任意输入流 校验和的应用类,该类可用于确认输入数据。这个包有一个界面、14个类和2个异 常类,如表1所示。

表 1∶java.util.zip 包

项目 类型 描述

Checksum 界面 由Adler32和CRC32类实现

Adler32 类 用于计算数据流的 Adler32 检验和

CheckedInputStream 类 维持正在读取的数据检验和的输入流。

CheckedOutputStream 类 维持写入数据的检验和的输出流。

CRC32 类 用于计算数据流的 CRC32 检验和

Deflater 类 支持使用 ZLIB 压缩库的常规压缩

DeflaterOutputStream 类 以紧缩压缩格式压缩数据的输出流过滤器

GZIPInputStream 类 文件格式压缩数据的输入流过滤器。

GZIPOutputStream 类 文件格式压缩数据的输出流过滤器。

Inflater 类 支持使用 ZLIB 压缩库的常规解压缩

InlfaterInputStream 类 解压紧缩压缩格式数据的输入流过滤器

ZipEntry 类 代表ZIP压缩文件条目

ZipFile 类 用于从ZIP文件中读取条目

ZipInputStream 类 读取ZIP文件格式文件的输入流过滤器

ZipOutputStream 类 以ZIP文件格式写入文件的输出流过滤器

DataFormatException 异常类 给出数据格式错误的信号

ZipException 异常类 给出 zip 错误的信号

注意: TZLIB压缩库最初是作为“可移植的网络图象文件格式”(PNG) 标准的一部分进行开发的,该标准不受专利的保护。

分享到:
评论

相关推荐

    JAVA文件压缩与解压缩实践的实现.rar

    压缩API:Java提供了java.util.zip和java.util.jar包来实现文件的压缩和解压缩操作。 压缩算法:通过选择不同的压缩算法,如DEFLATE算法用于ZIP格式,实现对文件的压缩。 流操作:使用Java的输入输出流(InputStream...

    rbzip2:Ruby的bzip2

    RBzip2 RBzip2是一颗gem,它提供用于压缩和解压缩的算法的各种实现。 当前,它包括基于的实现和速度较慢但可在任何Ruby VM上运行的纯Ruby实现。 此外,还有一个基于Commons Compress的JRuby特定实现。 纯Ruby实现...

    libjpeg-turbo-开源

    libjpeg-turbo是一个JPEG图像编解码器,它使用SIMD指令(MMX,SSE2,NEON,AltiVec)在x86,x86-64,ARM和PowerPC系统上加速基线JPEG压缩和解压缩。 在这样的系统上,libjpeg-turbo的速度通常是libjpeg的2-6倍,其他...

    libjpeg-turbo:SIMD加速的libjpeg兼容JPEG编解码器库-开源

    libjpeg-turbo是JPEG图像编解码器,它使用SIMD指令(MMX,SSE2,NEON,AltiVec)在x86,x86-64,ARM和PowerPC系统上加速基线JPEG压缩和解压缩。 在这样的系统上,libjpeg-turbo的速度通常是libjpeg的2-6倍,其他所有...

    图像编解码器Ygloo-external-jpeg-turbo.zip

    libjpeg-turbo 是一个图像编解码器,它使用 SIMD 指令 (MMX, SSE2,NEON) 在x86, x86-64, 和 ARM 系统上加快基线 JPEG 压缩和解压缩。在这些系统中,其他条件相同的情况下,libjpeg-turbo 通常比 libjpeg 快 2~4倍。...

    libjpeg-turbo:主libjpeg-turbo存储库

    libjpeg-turbo是一个JPEG图像编解码器,它使用SIMD指令来加速x86,x86-64,Arm,PowerPC和MIPS系统上的基线JPEG压缩和解压缩,以及x86,x86-64和Arm系统上的渐进JPEG压缩。 。 在这样的系统上,libjpeg-turbo的速度...

    libjpeg-turbo:https

    libjpeg-turbo是一个JPEG图像编解码器,它使用SIMD指令来加速x86,x86-64,Arm,PowerPC和MIPS系统上的基线JPEG压缩和解压缩,以及x86,x86-64和Arm系统上的渐进JPEG压缩。 。 在这样的系统上,libjpeg-turbo的速度...

    2017最新大数据架构师精英课程

    本资源为大数据基础到中高级教学资源,适合稍微有点大数据或者java基础的人群学习,资源过大,上传乃是下载链接,不多说,上目录: 1_java基础2 l3 a2 a$ t7 J2 b+ `- p 2_java引入ide-eclipse 3_java基础知识-循环...

    zipSurf-开源

    CGI 访问多个 zip 档案。 非常适合浏览 javadoc Java API 文档。 它需要一个网络服务器、bash 和解压缩。 可以即时生成交互式文件列表。

    易语言程序免安装版下载

     静态编译后的易语言EXE/DLL之间不能再共享譬如窗口、窗口组件等类似资源,对于已经静态连接到一个EXE/DLL中的支持库,该支持库中的数据或资源将不能再被其它EXE/DLL中所使用的同名支持库访问。这是因为代码被分别...

Global site tag (gtag.js) - Google Analytics