<script type="text/javascript"><!-- google_ad_client = "pub-3257410095942422"; /* 300x250, 创建于 08-3-1 */ google_ad_slot = "5285515829"; google_ad_width = 300; google_ad_height = 250; //--> </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("ads_core.google_render_ad", 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) } } |