| 由于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)
 }
 }
 
 |