Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Парсинг файлов средствами URLStream (http://www.flasher.ru/forum/showthread.php?t=147373)

alexg 02.12.2010 23:06

Парсинг файлов средствами URLStream
 
Здравствуйте!

Сразу хочу заметить, что я новичок как на этом форуме, так и в вопросах ActionScript в частности. Поэтому сильно прошу не пинать. :)

Идея моя заключается в следующем: пользователь скармливает флэшу файл (в общем случае - локальный файл через URLRequest), этот файл начинает загружаться URLStream и как только хватает данных для парсинга файла, закачка прерывается.

В идеале это должно работать для файлов любого размера - я ведь читаю только первые пару килобайт, однако ж не всё так гладко.

Вот такой небольшой класс реализует чтение (простейший набросок)

Код AS3:

package Classes.Data
{
        // импорт стандартных классов
        import flash.net.*;
        import flash.errors.*;
        import flash.events.*;
 
        //==============================================
        // класс
        public class CommonDataParser
        {
                //==============================================
                // данные класса
                //
                private var m_loader:URLStream;
 
                //==============================================
                // конструктор
                //
                public function CommonDataParser ()
                {
                        trace ("CommonDataParser - constructor");
                        m_loader = new URLStream ();
                }
 
                //==============================================
                // "destructor"
                //
                public function destroy ()
                {
                        trace ("CommonDataParser - destructor");
                        if (m_loader != null)
                        {
                                if (m_loader.connected)
                                {
                                        m_loader.close ();
                                }
 
                                m_loader.removeEventListener (Event.COMPLETE, completeHandler);
                                m_loader.removeEventListener (HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
                                m_loader.removeEventListener (IOErrorEvent.IO_ERROR, ioErrorHandler);
                                m_loader.removeEventListener (ProgressEvent.PROGRESS, progressHandler);
                                m_loader.removeEventListener (SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
 
                                m_loader = null;
                        }
                }
 
                //==============================================
                // методы
                //
                public function parse (filePath:String):void
                {
                        if ((filePath != null) && (filePath.length > 0))
                        {
                                trace ("File path: " + filePath);
                                var req:URLRequest = new URLRequest(filePath);
 
                                m_loader.addEventListener (Event.COMPLETE, completeHandler);
                                m_loader.addEventListener (HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
                                m_loader.addEventListener (IOErrorEvent.IO_ERROR, ioErrorHandler);
                                m_loader.addEventListener (ProgressEvent.PROGRESS, progressHandler);
                                m_loader.addEventListener (SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
 
                                try
                                {
                                        m_loader.load (req);
                                }
                                catch (error:Error)
                                {
                                        trace ("Unable to load requested URL: " + error);
                                }
                        }
                }
 
                private function completeHandler (event:Event):void
                {
                        trace ("completeHandler: " + event);
                }
 
                private function progressHandler (event:Event):void
                {
                        trace ("progressHandler: " + event);
                        if (event.target.bytesAvailable > 200000)
                        {
                                trace ("available: " + event.target.bytesAvailable);
                                destroy();
                                trace ("CommonDataParser - after destroy");
                        }
                }
 
                private function securityErrorHandler (event:SecurityErrorEvent):void
                {
                        trace ("securityErrorHandler: " + event);
                }
 
                private function httpStatusHandler (event:HTTPStatusEvent):void
                {
                        trace ("httpStatusHandler: " + event);
                }
 
                private function ioErrorHandler (event:IOErrorEvent):void
                {
                        trace ("ioErrorHandler: " + event);
                }
        }
}

В принципе, скрипт работает как надо - после вызова метода parse ("Имя_файла") оттуда читается всё, что надо, потом закрывается, удаляется, НО - после этого флэш-плеер висит как минимум с десяток секунд без отклика на мышь. Потом (через эти злосчастные десять секунд) всё приходит в норму и плеер снова реагирует на команды. Чем больше файл (я пробовал вплоть до 4 Гб), тем дольше эта пауза после "обрыва" загрузки. Никаких исключений и ошибок не выбрасывается.

Замечал по диспетчеру задач, что памяти особо много на выполнение не уходит, да и проц не сильно подгружается, но наглухо виснет после последнего обновления экрана вслед за окончанием парсинга.

Вопрос - с чем это может быть связано, как это можно победить и вообще, можно ли?
Может есть другой способ реализации парсинга файлов любой структуры без необходимости их полной загрузки в память (кроме как на Air)?

ПС
Система Win XP 32bit, Adobe Flash CS4, AS3.0

Спасибо.


Часовой пояс GMT +4, время: 00:42.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.