About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • May

    12

    在安装测试 Apache Flex SDK 时,发现 Apache Flex SDK Installer 有一个 MD5 的文件检测对比步骤,使得 Installer 长时间处于挂起状态。出于对性能的好奇,制作了两个简单的测试工具。第一个为本地 AIR 程序加载一个 8.33 M大小的文件,MD5 码计算用时约在 18 秒左右,样例代码如下:


    package {
        import com.adobe.crypto.MD5Stream;

        import flash.display.Sprite;
        import flash.events.Event;
        import flash.filesystem.File;
        import flash.filesystem.FileMode;
        import flash.filesystem.FileStream;
        import flash.utils.ByteArray;
        import flash.utils.getTimer;

        public class ASMD5FILE extends Sprite {

            private var fileStream:FileStream;
            private var filePath:String = "某个文件";//本人测试时随便找的一个文件为8.33 MB大小

            public function ASMD5FILE()
            {
                fileStream = new FileStream()
                fileStream.addEventListener(Event.COMPLETE, opened);
                fileStream.openAsync(new File(filePath), FileMode.READ);
            }

            protected function opened(event:Event):void
            {
                var bytes:ByteArray = new ByteArray();

                fileStream.readBytes(bytes);
                fileStream.close();

                //MD5Stream 文件来源 https://github.com/mikechambers/as3corelib
                var md5stream:MD5Stream = new MD5Stream;
                var t:Number = getTimer();
                trace(md5stream.complete(bytes))//MD5码:0bd6e6cb42bc7396edeaaef1c75be333
                trace(getTimer() - t);//18313毫秒
            }
        }
    }

    第二个采用 C++ 开发的 SWFKit 外壳程序做为播放器,并且调用播放器自带的文件 MD5 码检测函数仅用时间 182 毫秒,启动应用时瞬间完成计算,性能相差在 100 倍以上(囧)。

    import SWFKit.*;
    var t:Number = getTimer();
    Global.trace("" + Encryption.md5File("某个文件路径"))//与上同一文件,输出 0bd6e6cb42bc7396edeaaef1c75be333
    Global.trace("" + (getTimer() - t));//仅用时 182 毫秒

    Apache 真不该用 AIR 制作这个 Installer 。

    Jan

    20

    AIR 应用程序目前的 File 类在使用browseForSave() 方法时,没有文件扩展名过滤功能(没有 FileFilter 作为过滤列表)。一种替代方法是改成 FileReference 类的sava() 方法来保存数据,因为sava() 方法可以设置默认的保存文件名。但这并不是一个很好的方法,因为用户是可以修改扩展名的。所以可以对 File 类的 browseForSave() 方法可以作一些改进,让它变成有扩展名,并且在保存对话框中无法修改(但它也会有一个缺点,就是用户在保存时是看不到扩展名的,所以也就可以防止用户在保存时修改扩展名)。样例代码如下:

    //导出保存的文件
    var file:File = new File();
     
    try{
     file.browseForSave("保存为");
     file.addEventListener(Event.SELECT, saveData);
    }catch (error:Error){
     trace("保存失败:", error.message);
    }
     
    function saveData(event:Event):void{
     file = event.target as File;
     file.url += ".zfp";//这一步是关键,隐藏添加了扩展名
     var fileStream:FileStream = new FileStream();
     fileStream.open(file, FileMode.WRITE);
     fileStream.writeBytes("这里是要保存的数据");
     fileStream.close();
    }