Java和flash通信中数据的zlib压缩与解压缩
2009年08月25日
script type="text/javascript"> google_protectAndRun("ads_core.google_render_ad", google_handleError, google_render_ad);
上篇文章介绍和如何在java中将数据封装成flash可以直接读取的amf格式,amf虽然已经“压缩”过了(相对其他xml、json等,由于基于二进制而且比较少冗余数据,体积会小很多)。
但是还可以进一步压缩的,由于as3的bytearray支持compress和uncompress。所以我们可以在Java端将数据压缩,然后在flash端读取再解压缩,这样数据在传输过程中又会小很多。
下面就介绍使用方法,基于前篇文章的范例:
服务端:
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.zip.Deflater;
import java.util.zip.DeflaterOutputStream;
import java.util.zip.Inflater;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import flex.messaging.io.SerializationContext;
import flex.messaging.io.amf.Amf3Output;
import flex.messaging.log.Log;
import flex.messaging.messages.Message;
public class Test {
/**
* @param args
*/
public static void main(String[] args)
{
SerializationContext serializationContext=new SerializationContext();
Amf3Output amfOut = new Amf3Output(serializationContext);
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
DataOutputStream dataOutStream = new DataOutputStream(outStream);
amfOut.setOutputStream(dataOutStream);
HashMap map=new HashMap();
Double[] arr=new Double[10000];
for(int index=0;indexmap);
dataOutStream.flush();
} catch (IOException e)
{
e.printStackTrace();
}
byte[] messageBytes = outStream.toByteArray();
try
{
FileOutputStream os;
OutputStreamWriter ow;
BufferedWriter out;
os = new FileOutputStream("D://test.txt");
ow = new OutputStreamWriter(os);
out = new BufferedWriter(ow);
os.write(messageBytes);
os.flush();
os.close();
messageBytes=compressBytes(messageBytes); //将数据进行压缩
System.out.println("OK");
}catch(Exception e)
{
System.out.println("error :" + e);
}
}
private static int cachesize = 1024;
private static Inflater decompresser = new Inflater();
private static Deflater compresser = new Deflater();
public static byte[] compressBytes(byte input[])
{
compresser.reset();
compresser.setInput(input);
compresser.finish();
byte output[] = new byte[0];
ByteArrayOutputStream o = new ByteArrayOutputStream(input.length);
try
{
byte[] buf = new byte[cachesize];
int got;
while (!compresser.finished())
{
got = compresser.deflate(buf);
o.write(buf, 0, got);
}
output = o.toByteArray();
} finally
{
try
{
o.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
return output;
}
public static byte[] decompressBytes(byte input[])
{
byte output[] = new byte[0];
decompresser.reset();
decompresser.setInput(input);
ByteArrayOutputStream o = new ByteArrayOutputStream(input.length);
try
{
byte[] buf = new byte[cachesize];
int got;
while (!decompresser.finished())
{
got = decompresser.inflate(buf);
o.write(buf, 0, got);
}
output = o.toByteArray();
}catch(Exception e)
{
e.printStackTrace();
}finally
{
try
{
o.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
return output;
}
}
客户端:
public class AMF3Test extends Sprite
{
private var loader:URLLoader;
public function AMF3Test()
{
loader=new URLLoader();
loader.load(new URLRequest("D://test5.txt"));
loader.addEventListener(Event.COMPLETE,onComplete);
loader.dataFormat=URLLoaderDataFormat.BINARY;
}
private function onComplete(evt:Event):void
{
var start:Number=getTimer();
var byte:ByteArray=loader.data as ByteArray;
byte.uncompress() //将数据进行解压缩
var obj:Object=byte.readObject();
var end:Number=getTimer();
trace("耗时:"+(end-start)+"毫秒")
trace(obj.name,obj.age,obj.arr.length)
}
}
发表评论
-
vivi源代码最为详细分析(二)
2012-01-20 02:09 848vivi源代码最为详细分析(二) 2011年04月12日 ... -
Linux设备驱动程序编写
2012-01-20 02:09 677Linux设备驱动程序编写 2010年12月21日 一 ... -
Linux 编程段错误(segmentation error)总结
2012-01-20 02:09 728Linux 编程段错误(segmentation error) ... -
从头开始编写操作系统(8) 第7章:系统结构
2012-01-20 02:09 760从头开始编写操作系统( ... -
"Segmentation fault(段错误)"探究
2012-01-20 02:08 1514"Segmentation fault(段错误)&q ... -
e最著名的形容美女的词语
2012-01-19 09:59 1491e最著名的形容美女的词 ... -
中国军人赞美你
2012-01-19 09:59 896中国军人赞美你 2011年11月04日 有人喜欢教师,有 ... -
赞美女人的词语
2012-01-19 09:59 813赞美女人的词语 2011年02月24日 形容美貌: ... -
赞美客户词汇大全
2012-01-19 09:59 3225赞美客户词汇大全 2011 ... -
瑞友远程接入常见问题
2012-01-17 02:39 1915瑞友远程接入常见问题 2011年09月21日 常见问题解 ... -
X-Scan-v3.3 使用说明
2012-01-17 02:39 1647X-Scan-v3.3 使用说明 2011 ... -
C#与.net 3.5高级程序设计(第4版)
2012-01-17 02:39 668C#与.net 3.5高级程序设计 ... -
proteus VSM常见问题
2012-01-17 02:39 2273proteus VSM常见问题 2011年02月20日 ... -
通用(任何android机型)Root教程(完整版!附砖机自救方法)转自安卓网
2012-01-17 02:38 1069通用(任何android机型)Root ... -
ArcGIS Silverlight 客户端 1-2-3
2012-01-15 22:15 794ArcGIS Silverlight 客户端 1-2-3 2 ... -
RIA
2012-01-15 22:15 709RIA 2010年04月12日 Ja ... -
资料收集转载
2012-01-15 22:14 619资料收集转载 2009年11月07日 Flex开发相关优 ... -
RIA大讲堂- Flex基础培训(免费)
2012-01-15 22:14 674RIA大讲堂- Flex基础培训(免费) 2009年06月0 ...
相关推荐
java解压zlib和压缩zlib的jar
zlib压缩解压缩工具,包含源代码,拖拽文件直接压缩解压缩
Zlib压缩解压工具,第一次用请先运行reg.bat注册组件
ZLIB 解压缩代码移植到STM上
zlib库解压缩
由于项目需求,需要在C#中压缩,然后在java里解压缩,或者倒过来,在Java里压缩,C#里解压缩,以下代码经测试验证通过。 关键技术点和体会: 压缩的结果采用Base64编码,方便在Java端或者C#端打印出来调试,也方便...
基于Zlib压缩率的测试,包含压缩比,压缩时间,cpu占用率,压缩耗时
ZLIB数据压缩算法源码ZLIB数据压缩算法源码ZLIB数据压缩算法源码ZLIB数据压缩算法源码
Zlib主要用在上位机,因为无论是Windows、Linux、MAC都有足够的内存,单片机RAM非常小,源码中MAX_WBITS默认是15,需要两个32k才能正常工作,compress2也只能实现一次数据传入压缩。都不适合单片机使用。我在移植时...
基于ZLIB压缩库的数据或文件的压缩与解压缩
zlib 源码分析 对Huffman tree, lz77基础进行了深入讲解 对zlib的实现思路有深度的分析
用zlib1.dll实现压缩解压缩,可用于较大文件的网络压缩传输,提高传输效率
J2ME环境下基于ZLIB的数据压缩与解压缩.pdf
MsgBox "解压缩前字节数:" & (UBound(unpacked_bytes) - LBound(unpacked_bytes) + 1) Call UnPackStream(unpacked_bytes) MsgBox "解压缩后字节数:" & LenB(unpacked_bytes) str = unpacked_bytes 'StrConv...
zlib.dll和一个压缩解压缩的类模块。
VB中需要进行解压缩ZIP文件时,如果调用外置的winzip或者winrar始终不是很保险的做法。使用本程序中的模块及源码可以完美的解决这个问题。
zlib压缩算法.zip
自写C++ 基于ZLIB压缩库的数据或文件的压缩与解压缩小程序.zip
基于zlib封装的压缩解压缩lib库,下载包中含lib库源码及demo源码。支持文件、文件夹解压与压缩。编译环境VS2013。
zlib 压缩算法示例zlib 压缩算法示例zlib 压缩算法示例