`
wangleifire
  • 浏览: 508983 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java和flash通信中数据的zlib压缩与解压缩

    博客分类:
  • FLEX
阅读更多

Java和flash通信中数据的zlib压缩与解压缩

[来源:weni.cn | 作者:weni | 时间:2008-04-18 | 点击: <script src="http://www.5uflash.com/plus/count.php?aid=2938&amp;mid=&amp;view=yes"></script> 905 | 收藏本文   【 】]
<script type="text/javascript">&lt;!-- google_ad_client = &quot;pub-3257410095942422&quot;; /* 300x250, 创建于 08-3-1 */ google_ad_slot = &quot;5285515829&quot;; google_ad_width = 300; google_ad_height = 250; //--&gt; </script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script><script src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"></script><script src="http://googleads.g.doubleclick.net/pagead/test_domain.js"></script><script>google_protectAndRun(&quot;ads_core.google_render_ad&quot;, google_handleError, google_render_ad);</script>

上篇文章介绍和如何在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<String, Object> map=new HashMap<String, Object>();
    Double[] arr=new Double[10000];
    for(int index=0;index<10000;index++)
    {
     arr[index]=Math.random();
    }
    map.put("arr", arr);
    map.put("name", "weni");
    map.put("age", "27");
    try
    {
amfOut.writeObject(map);
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)
}
}

 

 

 

 

 

分享到:
评论

相关推荐

    java解压zlib和压缩zlib的jar

    java解压zlib和压缩zlib的jar

    Zlib压缩解压工具

    Zlib库的核心算法是Deflate,它结合了LZ77压缩和哈夫曼编码,实现了高效的无损数据压缩。解压缩过程则是逆向操作,恢复原始数据。Zlib还提供了流式压缩和解压缩的功能,可以在处理大文件时避免一次性加载到内存中,...

    zlib压缩解压缩工具,包含源代码

    5. **网络通信**: 在TCP/IP协议栈中,如QUIC协议,zlib可用于压缩传输数据,减少网络带宽消耗。 **zlib的优缺点** 优点: 1. 高效的压缩算法,压缩比良好。 2. 跨平台,支持多种操作系统。 3. 开源,可以自由使用...

    ZLIB解压缩STM32工程实例

    将ZLIB库移植到STM32工程中,可以实现嵌入式系统中的数据压缩和传输优化,比如在有限的存储空间内存储更多数据,或者通过网络高效传输数据。 3. **移植步骤** - **环境配置**:首先,你需要安装STM32的开发环境,...

    易语言zlib 压缩解压代码 +模块

    本文将详细介绍Zlib库以及如何使用易语言结合Zlib模块来实现文件和数据的压缩与解压缩。 首先,Zlib是由Jean-loup Gailly和Mark Adler开发的,它提供了多种压缩算法,如DEFLATE,这是gzip和PKZIP等流行压缩格式的...

    zlib库解压缩

    - **功能**:此函数用于将输入缓冲区 `source` 中压缩过的数据解压缩到输出缓冲区 `dest` 中。 - **参数**: - `dest`:指向目标缓冲区的指针,用于存储解压缩后的数据。 - `destLen`:一个指向 `uLongf` 类型...

    zlib压缩算法详解

    在解压缩过程中,zlib会解析已编码的位流,恢复LZ77的长度-距离对,并使用Huffman解码器恢复原始数据。zlib库还包含错误检测机制,如CRC校验,确保解压缩数据的完整性。 总结来说,zlib压缩算法是通过对数据进行LZ...

    ucos移植zlib和zip文件解压缩

    本篇文章将详细介绍如何在UCOS系统中移植ZLIB库以及实现ZIP文件的解压缩。 首先,ZLIB是一个开源的压缩库,它提供了数据的无损压缩和解压缩功能,常用于GIF、PNG等文件格式。移植ZLIB到UCOS涉及到以下几个关键步骤...

    vb使用Zlib进行zip解压缩的源码

    4. **循环解压每个文件**:对于ZIP文件中的每个数据块(代表一个或多个文件),使用Zlib的解压缩API进行解压,通常包括`inflateInit`、`inflate`和`inflateEnd`等函数。`inflateInit`初始化解压过程,`inflate`进行...

    C++ 基于ZLIB压缩库的数据或文件的压缩与解压缩小程序.zip

    ZLIB库是一个流行的开源压缩库,它提供了数据压缩和解压缩的功能,被许多编程语言,包括C++,用于实现文件和数据的压缩。本项目“C++ 基于ZLIB压缩库的数据或文件的压缩与解压缩小程序”正是利用了ZLIB库来实现这个...

    zlib1.dll实现压缩解压缩

    `zlib1.dll`是一个关键的库文件,它提供了高效的数据压缩和解压缩功能,广泛应用于各种软件开发中。本文将深入探讨`zlib1.dll`的工作原理、如何使用以及其在大文件网络传输中的应用。 `zlib1.dll`是zlib库的一部分...

    J2ME环境下基于ZLIB的数据压缩与解压缩.pdf

    ### J2ME环境下基于ZLIB的数据压缩与解压缩——关键技术解析 #### 一、引言:J2ME与ZLIB的结合背景 J2ME(Java2 Micro Edition),由Sun Microsystems为嵌入式和消费类电子设备设计的开发平台,与J2SE和J2EE并列为...

    zlib压缩算法.zip

    总的来说,zlib压缩算法及其库为开发者提供了强大而灵活的数据压缩解决方案,广泛应用于各种场景,从文件压缩到网络通信,无处不在。理解和掌握zlib的使用,对于提升软件的性能和用户体验具有重要意义。通过深入研究...

    ZLIB数据压缩算法源码

    ZLIB数据压缩算法是一种广泛应用的无损数据压缩库,由Jean-Loup Gailly和Mark ...通过阅读和理解ZLIB源码,开发者能更好地掌握数据压缩技术,并可能应用到自己的项目中,比如在网络传输、文件存储和数据交换等方面。

    数据压缩与解压库zlib

    数据压缩与解压库Zlib是计算机科学领域中一个重要的工具,主要用于数据的压缩和解压缩。这个库广泛应用于各种软件开发中,特别是在网络传输、文件存储和操作系统中,因为压缩数据可以有效地节省存储空间和提高传输...

    QT4.7 + ZLIB压缩解压测试工程

    QT4.7与ZLIB库结合使用,是开发者在C++环境中进行数据压缩与解压缩操作的一种常见方式。ZLIB库是一个开源的压缩库,它提供了高效的数据压缩和解压缩功能,广泛应用于软件开发,特别是在文件传输、网络通信等领域。QT...

    STM32(或其它国产单片机)移植Zlib进行数据压缩功能

    Zlib主要用在上位机,因为无论是Windows、Linux、MAC都有足够的内存,单片机RAM非常小,源码中MAX_WBITS默认是15,需要两个32k才能正常工作,compress2也只能实现一次数据传入压缩。都不适合单片机使用。我在移植时...

    精选_基于ZLIB压缩库的数据或文件的压缩与解压缩_源码打包

    本资源“精选_基于ZLIB压缩库的数据或文件的压缩与解压缩_源码打包”正是围绕这个主题,包含了一整套实现ZLIB压缩功能的源代码。 ZLIB库是由Jean-loup Gailly和Mark Adler开发的,最初是为PNG图像格式设计的,但...

    C#、java 字符流跨平台数据解压缩

    由于项目需求,需要在C#中压缩,然后在java里解压缩,或者倒过来,在Java里压缩,C#里解压缩,以下代码经测试验证通过。 关键技术点和体会: 压缩的结果采用Base64编码,方便在Java端或者C#端打印出来调试,也方便...

    JAVA文件压缩与解压缩实践(源代码+论文)

    在Java编程语言中,文件的压缩与解压缩是常见的任务,尤其在数据传输、存储优化以及备份场景下显得尤为重要。本资源"JAVA文件压缩与解压缩实践(源代码+论文)"提供了一个完整的实践教程,包括源代码和相关论文,帮助...

Global site tag (gtag.js) - Google Analytics