java压缩对象 与 对象的序列化
来源:互联网 发布:板材下料优化软件 编辑:程序博客网 时间:2024/05/21 10:19
gzip是目前广泛应用的一种压缩方式,它具有很高的压缩比和压缩效率.在sun公司发布的jdk中包含了java.util.zip包,对gzip提供了直接支持.使用java语言可以很方便的实现gzip压缩和解压缩.以下是一个压缩和解压缩的最简程序.
(压缩:gzip.java)
import java.io.*;
import java.util.zip.*;
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);
}
}
}
(解压缩:unzip.java)
import java.io.*;
import java.util.zip.*;
public class ungzip
{
public static void main(String[] args)
{
if (args.length !=2)
{
System.out.println("Usage:java ungzip ");
System.exit(1);
}
try
{
//建立gzip压缩文件输入流
FileInputStream fin=new FileInputStream(args[0]);
//建立gzip解压工作流
GZIPInputStream gzin=new GZIPInputStream(fin);
//建立解压文件输出流
FileOutputStream fout=new FileOutputStream(args[1]);
byte[] buf=new byte[1024];
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);
}
}
}
非面向对象语言要实现保存工作数据(如一个绘图程序保存一幅画面的定义),往往需要一个程序数据格式转换为外部文件格式存储,工作时再反向转换的过程.实现比较麻烦,编程不透明.而java语言是一种面向对象的语言,使用它的对象序列化特性,就可实现将工作对象(画面定义对象数据)直接写入硬盘,需要时再直接再读入内存,不需任何额外操作.实现非常方便.但由于写出对象为java类格式,因此数据冗余度较大.当数据量很大时,往往造成存储文件很大.过多的磁盘操作也导致数据读入花费了更多时间,占有了大量内存.采用gzip压缩存储对象是解决此类问题的有效手段.(在本人实现的一个监控系统中,调入一幅测试画面(10万个组件,压缩前7M,压缩后600K),压缩前对如画面后内存为26M,压缩后读入内存为12M,读入速度也大幅提高.效果十分明显).
java程序开发网络应用程序是它的最大优势,但在某些低速网络情况下(Internet、拨号网络).网络往往造成传输瓶颈, 影响应用效果,对于实时性要求高的应用影响更大.采用压缩可以有效改善通信效果.
可见,在java下的对象gzip压缩有着广泛的应用价值.以下是一个简单事例程序.
(串行化的数据对象文件:Data.java)
import java.io.*;
网管下载dl.bitscn.com
import java.util.zip.*;
public class Data implements Serializable//继承串行序列化接口
{
String name="匹配";
int age=123;
float height=1.902f;
}
(对象压缩解压缩类文件:compressObject.java)
import java.util.zip.*;
import java.io.*;
public final class compressObject
{
//将Data类型数据对象序列化对象压缩,返回字节数组,压缩后的对象数组可写入文件保存或用于网络传输
public static byte[] writeCompressObject(Data object_)
{
byte[] data_=null;
try
{
//建立字节数组输出流
ByteArrayOutputStream o = new ByteArrayOutputStream();
//建立gzip压缩输出流
GZIPOutputStream gzout=new GZIPOutputStream(o);
//建立对象序列化输出流
ObjectOutputStream out = new ObjectOutputStream(gzout);
out.writeObject(object_);
out.flush();
out.close();
gzout.close();
//返回压缩字节流
data_=o.toByteArray();
o.close();
public class Data implements Serializable//继承串行序列化接口
{
String name="匹配";
int age=123;
float height=1.902f;
}
(对象压缩解压缩类文件:compressObject.java)
import java.util.zip.*;
import java.io.*;
public final class compressObject
{
//将Data类型数据对象序列化对象压缩,返回字节数组,压缩后的对象数组可写入文件保存或用于网络传输
public static byte[] writeCompressObject(Data object_)
{
byte[] data_=null;
try
{
//建立字节数组输出流
ByteArrayOutputStream o = new ByteArrayOutputStream();
//建立gzip压缩输出流
GZIPOutputStream gzout=new GZIPOutputStream(o);
//建立对象序列化输出流
ObjectOutputStream out = new ObjectOutputStream(gzout);
out.writeObject(object_);
out.flush();
out.close();
gzout.close();
//返回压缩字节流
data_=o.toByteArray();
o.close();
}catch(IOException e)
{
System.out.println(e);
}
return(data_);
}
//将压缩字节数组还原为Data类型数据对象
public static Data readCompressObject(byte[] data_)
{
Data object_=null;
try
{
//建立字节数组输入流
ByteArrayInputStream i = new ByteArrayInputStream(data_);
//建立gzip解压输入流
GZIPInputStream gzin=new GZIPInputStream(i);
//建立对象序列化输入流
ObjectInputStream in = new ObjectInputStream(gzin);
//按制定类型还原对象
object_=(Data)in.readObject();
i.close();
gzin.close();
in.close();
}catch(ClassNotFoundException e)
{
System.out.println(e);
}catch(IOException e)
{
System.out.println(e);
}
return(object_);
}
}
(主程序:test.java)
import java.io.*;
import java.util.zip.*;
public class test
{
public static void main(String[] args)
{
Data testData_=new Data();
//未压缩数据对象内容
System.out.println("name="+testData_.name+" age="+testData_.age+" height="+testData_.height);
//压缩
byte[] i_=compressObject.writeCompressObject(testData_);
/*
可执行保存或网络传输,需要时还原或在对端还原
*/
//解压缩
Data o_=compressObject.readCompressObject(i_);
//解压缩后对象内容
System.out.println("name="+o_.name+" age="+o_.age+" height="+o_.height);
}
}
Data testData_=new Data();
//未压缩数据对象内容
System.out.println("name="+testData_.name+" age="+testData_.age+" height="+testData_.height);
//压缩
byte[] i_=compressObject.writeCompressObject(testData_);
/*
可执行保存或网络传输,需要时还原或在对端还原
*/
//解压缩
Data o_=compressObject.readCompressObject(i_);
//解压缩后对象内容
System.out.println("name="+o_.name+" age="+o_.age+" height="+o_.height);
}
}
----------------------+---------------------+------------------------------------
序列化:
1 ObjectOutputStreamoos= new ObjectOutputStream( new java.util.zip.GZIPOutputStream(
2 new FileOutputStream(outputFile)));
3 oos.writeObject(obj);
4 oos.close();
2 new FileOutputStream(outputFile)));
3 oos.writeObject(obj);
4 oos.close();
反序列化:
1 ObjectInputStreamois= new ObjectInputStream( new java.util.zip.GZIPInputStream(
2 new FileInputStream(userFile)));
3 Objectobj= ois.readObject();
4 ois.close();
2 new FileInputStream(userFile)));
3 Objectobj= ois.readObject();
4 ois.close();
(上述出自:http://www.blogjava.net/Andyluo/archive/2005/06/23/6609.html )
- java压缩对象 与 对象的序列化
- java压缩对象 与 对象的序列化
- java压缩对象 与 对象的序列化
- Java对象与ActionScript对象之间的序列化
- JAVA的对象序列化
- JAVA的对象序列化
- java的对象序列化
- Java对象的序列化
- Java 的对象序列化
- Java对象的序列化
- Java对象的序列化
- Java对象的序列化
- Java:对象的序列化
- Java对象的序列化
- Java对象的序列化
- Java对象的序列化
- Java对象的序列化
- java对象的序列化
- 对View组件布局和绘制过程, 以及Drawable绘制的理解
- jQuery基础教程之强大的选择器(过滤选择器-可见性过滤选择器)
- android按键功能的拓展
- Java的反编译代码~哪位大神可以赐教一下?
- jquery中大于号的作用
- java压缩对象 与 对象的序列化
- DAPM之一:概述
- 黑马程序员_java基础集合
- Xfire 获取客户端IP地址
- 当点击onBackpress方法或者onKeyDown方法时出现不能响应的问题解决办法
- 报恩
- 用Windows 结构化异常处理及虚拟内存的简单程序
- Linux下搭建Telnet和Ftp配置
- 中断嵌套和定时器的应用