资讯: 新闻 | 职场培训 服务: 论坛 | 博客 | 招聘 | 软件 | 辞典 | 网址 | 白皮书 | 教程 | 专题 | 订阅
文档: 前沿技术 | 组网 | 系统应用 | 安全 | 编程 | 存储 | 操作系统 | 数据库 | 服务器 | 案例库 | 产品
专栏: Java | .Net | 路由 | 交换 | iSCSI | SAS | 刀片 | Windows | Oracle | SQL | SOA | 中间件 | 杀毒
当前位置:首页>>专题总汇>>Java编程手册>>正文 其它栏目:
利用JAVA API函数实现数据的压缩与解压缩(4)
http://www.51cto.com 2005-10-11 00:00 作者:夏治(Tim) 出处:51cto.com
【导读】这篇文章简要的介绍了数据的压缩与解压缩,并展示了用java.util.zip包来实现数据的压缩与解压缩是多么的方便与高效。
压缩对象

我们已经看到如何将文件中的数据压缩并将其归档。但如果你想压缩的数据不在文件中时,应该怎么办呢?假设有这样一个例子,你通过套接字(socket)来传递一个大对象。为了提高应用程序的性能,你可能在通过网络开始传递前将数据压缩,然后在目的地将其解压缩。另外一个例子,我们假设你想将一个对象用压缩格式存储在磁碟上,ZIP格式是基于记录方式的,不适合这项工作。GZIP更适合用来实现这种对单一数据流的操作。现在,我们来示例一下,如果在写入磁碟前将数据压缩,并在读出时将数据解压缩。示例程序6是一个在单一JVM(java虚拟机)实现了Serializable接口的简单类,我们想要串行化该类的实例。

例程6源代码:

Employee.java

import java.io.*;

public class Employee implements Serializable {

String name;

int age;

int salary;

public Employee(String name, int age, int salary) {

this.name = name;

this.age = age;

this.salary = salary;

}

public void print() {

System.out.println("Record for: "+name);

System.out.println("Name: "+name);

System.out.println("Age: "+age);

System.out.println("Salary: "+salary);

}

}

现在,写另外一个类来创建两个从Employee类实例化而来的对象。示例程序7从Employee类创建了两个对象(sarah和sam)。然后将它们的状态以压缩的格式存储在一个文件中。

示例程序7源代码:

SaveEmployee.java

import java.io.*;

import java.util.zip.*;

public class SaveEmployee {

public static void main(String argv[]) throws

Exception {

// create some objects

Employee sarah = new Employee("S. Jordan", 28,

56000);

Employee sam = new Employee("S. McDonald", 29,

58000);

// serialize the objects sarah and sam

FileOutputStream fos = new

FileOutputStream("db");

GZIPOutputStream gz = new GZIPOutputStream(fos);

ObjectOutputStream oos = new

ObjectOutputStream(gz);

oos.writeObject(sarah);

oos.writeObject(sam);

oos.flush();

oos.close();

fos.close();

}}

现在,示例程序8中的ReadEmpolyee类是用来重新构建两个对象的状态。一但构建成功,就调用print方法将其打印出来。

示例程序8源代码:

ReadEmployee.java

import java.io.*;

import java.util.zip.*;

public class ReadEmployee {

public static void main(String argv[]) throws

Exception{

//deserialize objects sarah and sam

FileInputStream fis = new FileInputStream("db");

GZIPInputStream gs = new GZIPInputStream(fis);

ObjectInputStream ois = new ObjectInputStream(gs);

Employee sarah = (Employee) ois.readObject();

Employee sam = (Employee) ois.readObject();

//print the records after reconstruction of state

sarah.print();

sam.print();

ois.close();

fis.close();

}

}

同样的思想可以用于在网络间通过(socket)传输的大对象。下面的代码段示例了如何在客户/服务器之间实现大对象的压缩:

// write to client

GZIPOutputStream gzipout = new

GZIPOutputStream(socket.getOutputStream());

ObjectOutputStream oos = new

ObjectOutputStream(gzipout);

oos.writeObject(obj);

gzipos.finish();

下面的代码段显示了客户端从服务器端接收到数据后,如何将其解压:

// read from server

Socket socket = new Socket(remoteServerIP, PORT);

GZIPInputStream gzipin = new

GZIPInputStream(socket.getInputStream());

ObjectInputStream ois = new ObjectInputStream(gzipin);

Object o = ois.readObject();

对JAR文件进行操作

Java档案文件(JAR)格式是基于标准的ZIP文件格式,并附有可选择的文件清单列表。如果你想要在你我的应用程序中创建JAR文件或从JAR文件中解压缩文件,可以使用java.util.jar包,它提供了读写JAR文件的类。使用java.util.jar包提供的类与本文所讲述的java.util.zip包十分相似。所以你应该能够重新编写本文的源代码,如果你想使用java.util.jar包的话。

结束语

本文讨论了你可以在应用程序中使用的数据压缩与解压的应用程序接口,本文的示例程序演示了如何使用java.util.zip包来压缩数据与解压缩数据。现在你可以利用这个工具在你的应用程序中实现数据的压缩与解压了。

本文也说明了如何在络传输中实现数据的压缩与解压缩,以减少网络阻塞和增强你的客户/服务器模式应用程序的性能。在网络传输中实现数据的压缩,只有当传输的数据量达到成百上千字节时,你才会感觉到程序性能的提升,如果仅仅是传递一个字符串对象,对应用程序是没什么影响的。

本文所演示的代码经本人在Win2000平台下使用Java2SDK1.4.0调试通过。




共4页: 上一页 [1] [2] [3] 4
[好文章鼓励一下] [烂文章骂两句]
※相关文章※
·Java日程工具Flux 7.1发布 增加Ajax支持 (2006/03/29 13:35)
·专家称WEB2.0下Java在WEB开发领域处境危险 (2006/03/27 15:51)
·Java编译器工具EXteded Java Compiler初版发布 (2006/03/27 09:13)
·轻量级C/S组件EJOE 0.3.5_01发布 (2006/03/27 09:12)
·Java图形组件JGraph 5.8发布 (2006/03/24 09:39)
·Simple persistence for Java 1.2.0发布 (2006/03/24 09:35)
·jGnash工程最新发布了1.10.5版本 (2006/03/20 17:28)
·Java图形调试工具JSwat 3.8发布 (2006/03/20 09:03)
※推荐专题※

MySQL备份
※最新评论※ [查看评论]
[称赞还是怒骂全听您说]
网友昵称: 发表评论 (评论内容不能超过250字,请自觉遵守互联网相关政策法规.) 进入论坛
文章搜索
关键字:
最新TOP200
点击TOP200

Copyright©2005-2006 51CTO.COM 版权所有